2016-12-17 12 views
4

誰かが最後の数字が2または4の代わりに5である理由を具体的に説明できますか? 浮動小数点数が2進数の世界で不正確でなければならないことを知っているので、私は上のケースの結果がどのように詳細に行われたかを正確に得ることはできません。なぜ10/3が... 332または..334ではなく3.3333333333333335に等しいのですか?

+4

慎重に読んでください。これは、標準の「なぜこの浮動小数点の結果が不正確なのか」という質問ではありません。より具体的です:最後の数字の+/- 1以上のエラーはなぜですか? –

+1

@ JohnKugelman番号のバイナリ表現なので、他の投稿で扱われているようです。それは間違っていますか? –

+2

@ cricket_007:「バイナリなので」という表現は正確ではありますが、実際の説明として適格にするにはあまりにも多くの論理的な手順が欠けています。質問者は、浮動小数点はバイナリであることをすでに知っています。 – user2357112

答えて

5

... 335より小さい表現可能な最大値は... 330です(具体的には、2**-51、または最後の場所の1単位で小さくなります)。 ... 333は... 330よりも335に近いので、これは可能な限り丸めることです。

これを確認するにはいくつかの方法があります。 MSeifertはCまたはCythonから直接<math.h>でできることを示しています。 this visualization tool(Googlingの "浮動小数点表現"で検索し、上位の結果の1つを選択)を使用して、バイナリ表現で再生することもできます。

6

は、10/3の「真の値」になります。これは最も近いa(64ビット)だからです。

私はこのための任意の組み込み関数を知らないので、私は( math.h nexttoward機能をラップする)ここcythonを使用

%load_ext cython 

%%cython 
cdef extern from "<math.h>" nogil: 
    # A function that get's the next representable float for the 
    # first argument in direction to the second argument. 
    double nexttoward(double, long double) 

def next_float_toward(double i, long double j): 
    return nexttoward(i, j) 

(またはあなたもnumpy.nextafterを使用することができ@DSMで指摘したように)

私は10/3の値を表示する場合、この値のため、前と次に表現フロートは、私が取得:

>>> '{:.50}'.format(10/3) 
3.3333333333333334813630699500208720564842224121094 

>>> '{:.50}'.format(next_float_toward(10/3., 0)) 
3.3333333333333330372738600999582558870315551757812 

>>> '{:.50}'.format(next_float_toward(10/3., 10)) 
3.3333333333333339254522798000834882259368896484375 

したがって、各OT彼女の表現可能な浮動小数点値は "さらに"離れている。

+1

私は、しかし、 'np.nextafter'はおそらくもっとシンプルです(答えは私が作業していましたが、' .hex() 'と' float.fromhex'を使って手動でビルドしました)。 – DSM

関連する問題