Обычно ошибка с плавающей запятой относится к числу, которое не может быть сохранено в представлении IEEE с плавающей запятой.
Целые числа сохраняются с крайним правым битом, равным 1, и каждый бит слева удваивается (2,4,8, ...). Легко видеть, что это может хранить любое целое число до 2 ^ n, где n - количество битов.
Мантисса (десятичная часть) числа с плавающей запятой сохраняется аналогичным образом, но перемещается слева направо, и каждый последующий бит равен половине значения предыдущего. (На самом деле это немного сложнее, чем сейчас, но пока подойдет).
Таким образом, такие числа, как 0,5 (1/2), легко хранить, но не каждое число <1 может быть создано путем добавления фиксированного числа дробей в форме 1/2, 1/4, 1/8,. .. </p>
Действительно простой пример - 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, то все будет в порядке .) </p>