質問: Numpyのarangeを使ってfor文を回しているのですが,期待したarangeのループ回数でfor文が動作してくれません. 期待する動作は,`0.1575`から`0.2625`まで`0.0105`刻みでループしてほしいです. 現在,python 2.7.10を使用しています. 原因を教えていただきたいです. まずは,コードは以下になります. ``` for lnaTV in np.arange(0.1575, 0.273, 0.0105): print(lnaTV) ``` 出力は以下, ``` 0.1575 0.168 0.1785 0.189 0.1995 0.21 0.2205 0.231 0.2415 0.252 0.2625 0.273 ```
回答: 浮動小数点演算の丸め誤差が原因です。 numpyのarangeのドキュメントを見てみると > > stop : number > > End of interval. The interval does not include this value, except in some cases where step is not an integer and floating point round-off affects the length of out. > > > とあります。ざっと訳してみると「数列の最後。その数列はこの値を含まない。ただし、stepが整数ではなく、浮動小数点の丸めが出力配列の長さに影響を及ぼす場合を除く」です。 コンピュータ内では、通常、数値は2進数で保持されています。十進数では有限の桁の小数も、2進数では、多くの場合、循環小数になってしまいます。永遠に桁を保存することはできないので、循環小数は途中で切られてしまい、誤差を含んでいます。このため、十進数表現では、誤差の出ない計算も、2進数では誤差が出ることがあります。 今回の場合は、即値の0.273と、0.1575に0.0105を足していって出来た0.273を比べると、後者の方が、ほんのわずか小さくなっているのだと思います。