1. ホーム
  2. python

[解決済み] 16331239353195370.0に特別な意味はあるのでしょうか?

2023-04-08 18:51:05

質問

使用方法 import numpy as np ということに気がつきました。

np.tan(np.pi/2)

はタイトルの数字を与えるのであって np.inf

16331239353195370.0

この数字について興味があります。何かのシステムの機械精度パラメータと関係があるのでしょうか?私は何かからそれを計算したのでしょうか? (私は、以下のようなラインに沿って考えています。 sys.float_info )

EDITです。 Java、octace、matlab...といった他の環境でも、確かに同じ結果が再現されます。提案されたダミーでは、その理由は説明できませんが。

どのように解決するのですか?

pi は、Pythonのfloatとして正確に表現できるわけではありません(プラットフォームCの double 型と同じ)。 最も近い表現可能な近似値が使用されます。

以下は、私のボックスで使用されている正確な近似値です (おそらくあなたのボックスと同じです)。

>>> import math
>>> (math.pi / 2).as_integer_ratio()
(884279719003555, 562949953421312)

その比の正接を求めるために、今からwxMaximaに切り替えます。

(%i1) fpprec: 32;
(%o1) 32
(%i2) tan(bfloat(884279719003555) / 562949953421312);
(%o2) 1.6331239353195369755967737041529b16

というわけで、本質的に同じものが得られました。 へのバイナリ近似は pi/2 の数学的な値 ("infinite precision") よりも少し小さくなっています。 pi/2 . そのため、非常に大きな正接が得られる代わりに infinity . 計算された tan() は実際の入力に対して適切です!

全く同じ種類の理由で、例えば

>>> math.sin(math.pi)
1.2246467991473532e-16

は0を返しません。 近似値である math.pi よりも少し小さく pi であり,表示結果は正しい となり であり、表示される結果はその真理が正しい。

math.piの他の見方

使用されている正確な近似値を見るにはいくつかの方法があります。

>>> import math
>>> math.pi.as_integer_ratio()
(884279719003555, 281474976710656)

math.pi は、その比率の数学的な ("infinite precision") 値に正確に等しくなります。

または16進数表記で正確な浮動小数点数として。

>>> math.pi.hex()
'0x1.921fb54442d18p+1'

あるいは、ほぼすべての人に最も容易に理解される方法で。

>>> import decimal
>>> decimal.Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')

すぐにはわからないかもしれませんが、すべての有限の2進浮動小数点は有限の10進浮動小数点として正確に表現できます(逆は ではない は真であり、例えば10進数の 0.1 は有限の2進浮動小数点として正確に表現できるわけではありません)、そして Decimal(some_float) のコンストラクタは正確に等価なものを生成します。

の真の値は以下の通りです。 pi の正確な10進数値が続きます。 math.pi であり、3行目のキャレットは両者が異なる最初の桁を指しています。

true    3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
                         ^

math.pi は、現在ではほとんどすべてのボックスで同じバイナリ浮動小数点フォーマット (IEEE 754 倍精度) を使用しているため、quot; almost all" ボックス全体で同じになります。 上記のいずれかの方法を使用して あなたの ボックスでそれを確認するか、またはボックスが例外である場合に使用されている正確な近似値を見つけるために、上記の方法のいずれかを使用できます。