2013-03-24 4 views
2

Я попытался скомпилировать следующий код.Странная вещь в коде Matlab

x = 0 
while x <= 1 
    x = x+0.02 
end 

Последнее значение х, что я должен получить равен 1,02 (что сделать ложное состояние в то время как петля)

Однако, я очень интересно, что я всегда получал последнее значение х, равной до 1 и цикл while остановлен. Я не знаю, что случилось с моим кодом. Может ли кто-нибудь помочь мне узнать?

+0

Просто для информации для тех, кто хочет сделать цикл в состоянии с плавающей запятой, я ответил на мой вопрос, чтобы сделать это, выполнив следующий код. х = 0 а х <= 1 + 4.4409e, 16 х = + 0,02 конец Это не совсем хороший метод, если у кого-то другое решение, вы можете поделиться ею !, но мой вопрос решен: -) – 2013-03-25 18:29:40

ответ

5

0.02 не может быть представлен точно в двоичном числе с плавающей запятой (double), поэтому вы получите некоторые ошибки округления. В результате вы не достигаете одного, а количество, которое немного больше, чем одно.

Попробуйте добавить disp(x-1) после кода, чтобы увидеть, что x не совсем 1.

Этот сайт показывает, как 0,02 представлен в IEEE754 двойной точности с плавающей точкой: http://www.binaryconvert.com/result_double.html?decimal=048046048050

Существенным моментом здесь является то, что он немного больше, чем 0,02

Одним из способов решения этого вопроса будет использование целочисленной переменной цикла. Это еще типа двойной, но он имеет только целые значения, которые не имеют округления вопросы, если не использовать очень большое число (> = 2^56?)

for n=0:100 
    x = n/100; 
end 
+0

Большое спасибо @Kleist. Меня это удивило !!. Итак, не могли бы вы предложить мне, как я могу изменить свой код, чтобы мой код запускался в последний раз? – 2013-03-24 22:58:58

+0

Добавлено решение моего ответа. – Kleist

+0

Ваш метод очень хорошо. Тем не менее, я должен вычислить значение вероятности, которое абсолютно имеет тип двойного значения, использует значение <= 1. Затем я рисую график. Можно ли использовать переменную цикла двойного значения? – 2013-03-24 23:15:16

0

Попробуйте format long перед запуском вы получите это:

x = 0.920000000000000 
x = 0.940000000000001 
x = 0.960000000000001 
x = 0.980000000000001 
x = 1.000000000000000 

Обратите внимание на 1 в самом конце. 0.02 не может быть точно представлена ​​с арифметикой с плавающей запятой. Поэтому, хотя он выглядит как 1, когда вы его сравниваете, он на самом деле больше, поэтому он появляется как ложный и существует цикл.

+0

Большое спасибо @Ben. Не могли бы вы дать мне несколько советов, что я должен изменить в своем коде для запуска в последний раз? – 2013-03-24 23:03:07

Смежные вопросы