2011-10-19 10 views

答えて

10

違いは唯一の書式ルーチンに起因すると思わ:

>>> '%.30f' % math.cos(60./180.*math.pi) 
'0.500000000000000111022302462516' 
>>> '%.30f' % np.cos(60./180.*np.pi) 
'0.500000000000000111022302462516' 

np.cos戻りnp.float64ではなくfloat、と明らかにそのタイプがデフォルトで異なって印刷されます。一般的なハードウェアでは、どちらも64ビットのdoubleとして実装されているため、実際の精度に違いはありません。

+0

'np.float64'と' float'は、同じIEEE-754倍精度データ型でバックアップされます。 –

+1

@DavidHeffernan:ちょうど同じ '__repr__'とは異なります。 –

+0

もちろん、あなたの答えで指摘しておいたことは役に立ちます。私は、あなたが2倍の値でどれだけの精度を持っているかを感じることも有益だと思います。実際には、コードを実行せずに数字を数えるだけで、この質問にすべて答えることができます。 –

4

Double precision算術演算では、小数点以下15桁から16桁の有効数字が得られます。これらの2つの値はその精度に一致します。何も心配しないでください。 Iは、倍精度値のバイナリ表現の仮数のために使用される53 バイナリビットと対比する小数を言う

注意。

+0

はい、私はそれが倍精度精度の先端にあったことを知っていました! – hatmatrix

+0

それはあなたが尋ねた質問とまったく同じです。「この違いがマシン の精度内にあることを確認するにはどうすればよいですか?それは私が答えようとしたものです。 –

2

数字が等しいと判明したにもかかわらず、それらを完全精度で調べる方法を知ることは、依然として有効です。

>>> a = 1.1 + 2.2 
>>> b = 3.3 
>>> a == b 
False 
>>> from decimal import Decimal 
>>> Decimal.from_float(a) 
Decimal('3.300000000000000266453525910037569701671600341796875') 
>>> Decimal.from_float(b) 
Decimal('3.29999999999999982236431605997495353221893310546875') 
>>> a.hex() 
'0x1.a666666666667p+1' 
>>> b.hex() 
'0x1.a666666666666p+1' 
>>> a.as_integer_ratio() 
(7430939385161319, 2251799813685248) 
>>> b.as_integer_ratio() 
(3715469692580659, 1125899906842624) 
+0

これは良い方法です。 'R'には' .Machine $ double.eps'と '.Machine $ double.neg.eps'という変数があり、これは公差を設定するのに使うことができますが、これらのテストは役に立ちます... – hatmatrix

+0

あるいは'小数点(a) '; 'from_float'メソッドの必要はありません。 –

関連する問題