2017-10-10 6 views
0

次のスニペットでは、出力に128.99が含まれています。定義では使用しないでください。バグですか? python2とpython3の両方でテストされています。`np.mgrid`のバグはありますか?

In [38]: np.mgrid[119.99:128.99, 0:2] 
Out[38]: 
array([[[ 119.99, 119.99], 
    [ 120.99, 120.99], 
    [ 121.99, 121.99], 
    [ 122.99, 122.99], 
    [ 123.99, 123.99], 
    [ 124.99, 124.99], 
    [ 125.99, 125.99], 
    [ 126.99, 126.99], 
    [ 127.99, 127.99], 
    [ 128.99, 128.99]], 

    [[ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ]]]) 
+2

それは浮動だポイントごと、ポイントは包括的であることが、今、「停止」注意してください:あなたはMGRID内のアイテムの数に依存している場合

、複雑なステップインデックスを使用します。丸め誤差は正常です。浮動小数点範囲が必要な場合は、 'linspace'または' mgrid'の複合ステップ形式を使用する必要があります。 – user2357112

答えて

2

np.mgridは2つの引数で呼び出され、対応する範囲に開始から終了までの項目が入ります。ステップは、デフォルトで1ある

math.ceil((key[k].stop - start)/(step*1.0)) 

はステップ数であり、使用される式(参照source)を決定します。あなたの状況では、stop-startは9.000000000000014なので、ceil関数の丸めによってステップ1の10ステップが生成されます。119.99 + 9 = 128.99

ここではバグはありません。

np.mgrid[119.99:127.99:9j, 0:2]. 

docs

+0

要約すると、問題は、1) 'float'表現の丸め誤差2)' ceil'関数によって整数のステップ数が生成されます。したがって、非常に小さな丸め誤差が発生すると、ステップ数が異なります。 PS: 'decimal.Decimal()'は 'float'の正確な値をチェックするために使用できます – beaver

関連する問題