[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Исключение иррациональности
Franco
Всем доброго дня и хорошего настроения!

По ходу написания кода возникла следующая проблема (я заранее прошу прощения, если данная тема поднималась ранее - ввиду крайней загруженности личного графика не имел возможности проверить все и вся).

По ходу вычислений в программе переменные принимают и отображают неудобные для рядового пользователя значения - например, 1.7320508075689, что есть корень из 3 (sqrt(3)). Существует ли возможность каким-либо образом заменять все иррациональные значения соответствующими аналогами с корнями? Буду признателен за подробный ответ с кодом.

Спасибо!
Игорь_Vasinsky
Цитата
заменять все иррациональные значения соответствующими аналогами с корнями?

существующими где? в природе?

можно попробовать так

$str = 1.7320508075689;
$sqr = 'sqrt('.ceil(pow(1.7320508075689,2)).')';


вернёт строку sqrt(3) ))

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
sergeiss
Цитата (Franco @ 4.02.2014 - 21:29)
Существует ли возможность каким-либо образом заменять все иррациональные значения соответствующими аналогами с корнями?

Ну не все, а только те, что ты заложишь где-нибудь в конфиге. Сравнивай значения с теми, что получаешь при вычислениях. С какой-нибудь точностью, допустим, до 10-го знака.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Franco
Игорь_Vasinsky

Спасибо!
Но меня, скорее, интересует такой вариант кода, который автоматически при любом echo $irr, где $irr - иррациональное число, выдавал на экран значение типа √3 (используя символ корня).

sergeiss

Благодарю!
Хотелось бы понять точнее эту мысль. Вы имеете в виду, каждый раз при исполнении релевантой команды записывать условие? Например:


switch ($irr) {
case 1.732050807:
echo "√3";
break;
case 1.414213562:
echo "√2";
break;
case 2:
//и так далее
}
?>


Это было бы слишком долго и не очень удобно, т.к. код объемный.
Игорь_Vasinsky
$str = 1.7320508075689;

$temp_data = explode(".", $str);

$len = 5; //Кол-во цифр после запятой, при котором нужно показать квадрат числа, а не само число

if(isset($temp_datap[1]) && strlen($temp_datap[1])>=$count)
echo '√'.ceil(pow(1.7320508075689,2));
else
echo $str;


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Franco
Игорь_Vasinsky

Спасибо, это уже ближе!
А можно сделать так, чтобы подобная операция выполнялась не для определенной переменной, а для всех чисел в коде? Иначе говоря, если любой переменной присвоено значение 1.732050807, то всегда при отображении заменяется на √3?
Игорь_Vasinsky
если жёстко привязано - то как выше сергейсс написал.

я предложил просто округлять - есть большое дробное число

можно всегда использовать для всех чисел



function getData($dig,$len)
$temp_data = explode(".", $dig);

if(isset($temp_datap[1]) && strlen($temp_datap[1])>=$len)
return '√'.ceil(pow(1.7320508075689,2));
else
return
$str;
}


использовать

echo getData(1.7320508075689,5);


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Franco
Игорь_Vasinsky

Большое Вам спасибо! Кажется, это то, что нужно.
sergeiss
Цитата (Franco @ 4.02.2014 - 22:19)
Вы имеете в виду, каждый раз при исполнении релевантой команды записывать условие? Например:

Примерно так, да. Только надо учесть, что у вычислений будет некая точность.

Ну, например, в ПХП есть константа для числа Пи, равная 3.14159265359. В вычислениях ты можешь получить 3.14159194356. Вполне очевидно, что "с точностью до 5 знака" числа совпадают. Но если ты их сравнишь "в лоб", то получишь, что они разные.
Поэтому я и сказал, что надо:
1. Получить полный перечень всех констант, с которыми ты будешь сравнивать.
2. Сделать некую функцию, которая будет с заранее заданной точностью сравнивать с каждым из эталонов и принимать решение о тождественности чему-то. Например, вычитаем испытуемое число из эталона, получаем для одного из эталонов модуль разности меньше "10 в минус 4 степени", значит, число равно этому эталону. Можно взять и 10^-6 smile.gif Это уж как захочешь.

Решение "от Игоря" не является универсальным для получения, например, Пи, Пи/2, корень из 2, корень из 3, е, ..... Только сравнением - с некоторой точностью - можно получить достоверный результат, с заданной точностью, и без подводных камней.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Franco
sergeiss

Специфика программы такова, что абсолютная тождественность не нужна. Ну и, собственно говоря, добиться полного соответствия невозможно smile.gif В любом случае, Ваши комментарии очень многое прояснили.

Игорь_Vasinsky

Код почему-то не работает... Синтаксис для меня нов, не могу найти ошибку. Причем ошибки как таковой нет, echo просто ничего не отображает.
Игорь_Vasinsky
function getData($dig,$len){
$temp_data = explode(".", (string)$dig);
//ceil или floor
if(isset($temp_data[1]) && (strlen($temp_data[1])>=$len))
return '√'.ceil(pow($dig,2));
else
return
$dig;
}


echo getData(1.744343434,3);


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Franco
Игорь_Vasinsky
Блестяще! Все работает! Внесу единственное изменение - буду вместо ceil использовать round - мало ли, получится 3,0000000000001 (как, кстати, в данном случае smile.gif ).
Спасибо, что уделили мне время!
Игорь_Vasinsky
(int) приведёт к целому числу

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Franco
Игорь_Vasinsky

Я наткнулся на интересную сложность - а как быть с некоторым числом 0<a<1? При возведении в квадрат оно дает еще меньшее число (и также иррациональное). Верно ли я полагаю, что этапы для a будут следующими:

1. a записать в виде периодической дроби
2. Представить периодическую дробь как обыкновенную
3. Сократить дробь, используя НОК
4. Для числителя и знаменателя по отдельности провести вышеописанную программу для корня
5. На выходе получаем дробь (например, √113/73)?
Franco
Игорь_Vasinsky
Проблема решена, извините за беспокойство.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.