Вопрос в MATLAB о сравнении значений с пи

Я хочу найти число пи в MATLAB, и когда я его сравниваю с числом пи, которое уже реализовано в MATLAB. Итак, когда я пишу

while(p~=pi)             

цикл кажется бесконечным, потому что он продолжает проверять все цифры, которые есть у MATLAB pi.

Итак, когда я написал:

p=3.1416;
if p==pi
  disp('yes');
else
  disp('no');
end

ответ, естественно, был отрицательным. Итак, я хочу найти способ сохранить только пять цифр после точки и проверить это, проверить на pi = 3,14159.

Кто-нибудь может помочь?


person system    schedule 26.05.2011    source источник


Ответы (3)


if abs(p-pi) <= 1e-5
  disp yes;
else
  disp no;
end

См. этот ответ о переполнении стека для подробностей.

person SCFrench    schedule 26.05.2011
comment
в конце концов я тоже так поступил! Спасибо - person system; 26.05.2011

Посмотрите на функцию round2 в File Exchange. Это позволяет округлить до определенного количества десятичных знаков. Например. для вашего примера:

if round2(p,1e-5) == round2(pi,1e-5),
    disp('yes');
end
person n00dle    schedule 26.05.2011
comment
Обратите внимание, что round2 на самом деле НЕ округляется до указанного количества десятичных знаков. round2 (1.23, .1) фактически производит число 1.20000000000000017763568394002504646778106689453125 - person ; 26.05.2011
comment
Проблема, конечно, в том, что нельзя точно представить число 1.2 в Matlab. ВСЕГДА остерегайтесь ограничений точности операций с плавающей запятой. - person ; 26.05.2011
comment
Ах хороший момент. Но, конечно, если pi и p одинаковы, то ближайшее значение FP из round2 также должно быть таким же? - person n00dle; 27.05.2011
comment
В ваших рассуждениях есть еще один недостаток. Можно иметь два разных числа, которые round2 отправит к разным результатам, но они действительно ближе, чем допуск. ›› x = [1.199 1.201]; ›› round2 (x, 0,00725) ans = 1,1963 1,2035 - person ; 27.05.2011
comment
Этот пример полностью зависит от введенного вами значения округления. если вы сделали ›› T = [1.199 1.201] ›› round2 (T, 0.01) ans = 1.2000 1.2000. Если затем сравнить ответы, получится: ›› ans (1) == ans (2) ans = 1 - person n00dle; 27.05.2011
comment
Да, это зависит от допуска. И это ИМЕННО проблема с использованием round2. Вы можете получить произвольный результат, который может быть таким же или нет, изменив только допуск, и то на небольшую величину. ›› round2 (x, 0,0072) ans = 1.2024 1.2024 ›› round2 (x, 0,00725) ans = 1,1963 1.2035 ›› round2 (x, 0,0073) ans = 1,1972 1.2045 ›› round2 (x, 0,0074) ans = 1,1988 1,1988 - person ; 27.05.2011

Для сравнения чисел с плавающей запятой следует использовать eps. что-то вроде

если abs (p-pi) ‹= eps .... то же самое

Я также видел, как 2 * eps использовались вместо eps. Но приведенное выше - лучший способ сравнить числа с плавающей запятой. В вашем случае это становится

в то время как abs (p-pi)> 2 * eps ..... конец

- Насер

person Nasser    schedule 26.05.2011
comment
Технически, наиболее точным использованием EPS было бы передать ему величина сравниваемых значений. Вызов EPS без аргумента вернет расстояние от 1.0 до следующего по величине числа с двойной точностью (около 2.2204e-016), но eps(pi) даст вам относительную точность с плавающей запятой в два раза больше (около 4.4409e-016). - person gnovice; 27.05.2011
comment
хорошая точка зрения. Вот почему некоторые используют 2 * eps, как я уже упоминал. Но теперь я вижу, что ваше предложение сделать eps (magnitude) лучше, чем сделать 2 * eps. - person Nasser; 27.05.2011