一般に、浮動小数点エラーとは、IEEE 浮動小数点表現で格納できない数値を指す場合を指します。
整数は、右端のビットが 1 で、左の各ビットがその 2 倍 (2、4、8、...) で格納されます。n がビット数である場合、これが 2^n までの任意の整数を格納できることは簡単にわかります。
浮動小数点数の仮数部 (小数部) も同様の方法で格納されますが、左から右に移動し、連続する各ビットは前の値の半分になります。(実際にはこれよりも少し複雑ですが、今のところはこれで十分です)。
したがって、0.5 (1/2) のような数値は簡単に格納できますが、1/2、1/4、1/8 などの形式の固定数の分数を加算して 1 未満のすべての数値を作成できるわけではありません。
非常に単純な例は 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
>>>
どの言語を使用していても、float と double を使用した等価性テストには十分に注意する必要があります。
(あなたの例では、0.2はIEEEバイナリに格納できない厄介な数値の1つですが、p <= 0.2のように等式ではなく不等式をテストしている限り、問題ありません。)