57312


Numpyのarangeを使ってfor文を回しているのですが，期待したarangeのループ回数でfor文が動作してくれません．  
期待する動作は，`0.1575`から`0.2625`まで`0.0105`刻みでループしてほしいです．

現在，python 2.7.10を使用しています．

原因を教えていただきたいです．

まずは，コードは以下になります．

[code]

    for lnaTV in np.arange(0.1575, 0.273, 0.0105):
        print(lnaTV)
    
[/code]

出力は以下，

[code]

    0.1575
    0.168
    0.1785
    0.189
    0.1995
    0.21
    0.2205
    0.231
    0.2415
    0.252
    0.2625
    0.273
    
[/code]


CC BY-SA 4.0
2019-08-11T03:18:32.367
57293
2019-08-12T04:48:11.133
30173
question
python
Numpyのarangeに関する質問


浮動小数点演算の丸め誤差が原因です。

numpyのarangeの[ドキュメント](https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html)を見てみると

> 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を比べると、後者の方が、ほんのわずか小さくなっているのだと思います。


CC BY-SA 4.0
2019-08-12T04:48:11.133
57312
2019-08-12T04:48:11.133
3605
57293
answer