値のコサインを計算すると少し異なる結果になります。この違いが機械精度内にあることを確認するにはどうすればよいですか?Pythonの数学、numpyのモジュールは異なる結果ですか?
import math
math.cos(60.0/180.0*math.pi)
-> 0.5000000000000001
import numpy
numpy.cos(60.0/180.0*numpy.pi)
-> 0.50000000000000011
値のコサインを計算すると少し異なる結果になります。この違いが機械精度内にあることを確認するにはどうすればよいですか?Pythonの数学、numpyのモジュールは異なる結果ですか?
import math
math.cos(60.0/180.0*math.pi)
-> 0.5000000000000001
import numpy
numpy.cos(60.0/180.0*numpy.pi)
-> 0.50000000000000011
違いは唯一の書式ルーチンに起因すると思わ:
>>> '%.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
として実装されているため、実際の精度に違いはありません。
Double precision算術演算では、小数点以下15桁から16桁の有効数字が得られます。これらの2つの値はその精度に一致します。何も心配しないでください。 Iは、倍精度値のバイナリ表現の仮数のために使用される53 バイナリビットと対比する小数を言う
注意。
はい、私はそれが倍精度精度の先端にあったことを知っていました! – hatmatrix
それはあなたが尋ねた質問とまったく同じです。「この違いがマシン の精度内にあることを確認するにはどうすればよいですか?それは私が答えようとしたものです。 –
数字が等しいと判明したにもかかわらず、それらを完全精度で調べる方法を知ることは、依然として有効です。
>>> 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)
これは良い方法です。 'R'には' .Machine $ double.eps'と '.Machine $ double.neg.eps'という変数があり、これは公差を設定するのに使うことができますが、これらのテストは役に立ちます... – hatmatrix
あるいは'小数点(a) '; 'from_float'メソッドの必要はありません。 –
'np.float64'と' float'は、同じIEEE-754倍精度データ型でバックアップされます。 –
@DavidHeffernan:ちょうど同じ '__repr__'とは異なります。 –
もちろん、あなたの答えで指摘しておいたことは役に立ちます。私は、あなたが2倍の値でどれだけの精度を持っているかを感じることも有益だと思います。実際には、コードを実行せずに数字を数えるだけで、この質問にすべて答えることができます。 –