Как правило, ошибка с плавающей запятой относится к числу, которое не может быть сохранено в представлении с плавающей точкой IEEE.
Целые числа хранятся с самым правым битом, равным 1, и каждый бит влево является двойным (2,4,8, ...). Легко видеть, что это может хранить любое целое число до 2^n, где n - количество бит.
Мантисса (десятичная часть) числа с плавающей запятой сохраняется аналогичным образом, но перемещается влево-вправо, а каждый последующий бит составляет половину значения предыдущего. (Это на самом деле немного сложнее, чем это, но сейчас это будет сделано).
Таким образом, цифры, такие как 0,5 (1/2), просты в хранении, но не каждое число < 1 может быть создано путем добавления фиксированного количества долей формы 1/2, 1/4, 1/8, ...
Действительно простой пример: 0,1 или 1/10. Это можно сделать с помощью бесконечной серии (которую я действительно не могу потрудиться), но всякий раз, когда компьютер хранит 0,1, это не совсем такое количество, которое хранится.
Если у вас есть доступ к машине Unix, это легко увидеть это:.
Python 2.5.1 (r251:54863, Apr 15 2008, 22:57:26)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1
0.10000000000000001
>>>
Вы хотите быть очень осторожным с тестами равенства с поплавками и парном разряде, в каком бы языке вы в
(Что касается вашего примера, 0.2 - это еще один из этих надоедливых чисел, которые нельзя сохранить в двоичном формате IEEE, но пока вы проверяете неравенства, а не равенства, например p < = 0.2, тогда вы будете в порядке .)
Я думаю, что вам действительно нужно это: [Что каждый ученый должен знать о арифметики с плавающей точкой] (http://docs.sun.com/source/ 806-3568/ncg_goldberg.html). – Patrick 2008-10-30 07:17:08
Читайте это: http://blog.frama-c.com/index.php?post/2013/05/02/nearbyintf1 – 2013-05-03 19:09:13