Python 16331239353195370.0是否具有特殊意义?

Python 16331239353195370.0是否具有特殊意义?,python,numpy,numerical-methods,Python,Numpy,Numerical Methods,使用import numpy作为np我注意到 np.tan(np.pi/2) 在标题中给出数字,而不是np.inf 16331239353195370.0 我对这个数字很好奇。是否与某些系统机器精度参数有关?我能从什么东西算出来吗?(我的思路与sys.float\u info类似) 编辑:同样的结果确实可以在其他环境中重现,如Java、octace、matlab。。。但是,建议的dupe并没有解释为什么。pi不能像Python float那样精确地表示(与平台C的double类型相同)。使用

使用
import numpy作为np
我注意到

np.tan(np.pi/2)
在标题中给出数字,而不是
np.inf

16331239353195370.0
我对这个数字很好奇。是否与某些系统机器精度参数有关?我能从什么东西算出来吗?(我的思路与
sys.float\u info
类似)


编辑:同样的结果确实可以在其他环境中重现,如Java、octace、matlab。。。但是,建议的dupe并没有解释为什么。

pi
不能像Python float那样精确地表示(与平台C的
double
类型相同)。使用最接近的可表示近似值

以下是在我的盒子上使用的精确近似值(可能与在你的盒子上相同):

为了找到这个比率的切线,我现在要切换到wxMaxima:

(%i1) fpprec: 32;
(%o1) 32
(%i2) tan(bfloat(884279719003555) / 562949953421312);
(%o2) 1.6331239353195369755967737041529b16
基本上和你得到的一样。所使用的
pi/2
的二进制近似值略小于
pi/2
的数学(“无限精度”)值。所以得到的是一个非常大的切线,而不是无穷大。计算的
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
正好等于该比率的数学(“无限精度”)值

或作为十六进制表示法中的精确浮点:

>>> math.pi.hex()
'0x1.921fb54442d18p+1'
或者以一种几乎每个人都能理解的方式:

>>> import decimal
>>> decimal.Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')
虽然这可能不是很明显,但每个有限二进制浮点都可以精确地表示为有限十进制浮点(反之则不正确;例如,十进制
0.1
不能精确地表示为有限二进制浮点),而
十进制(某些浮点)
构造函数生成精确的等价项

下面是
pi
的真实值,后面是
math.pi
的精确十进制值,第三行上的插入符号指向第一个数字,它们的不同之处:

true    3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
                         ^

math.pi
现在在“几乎所有”框中都是相同的,因为现在几乎所有的框都使用相同的二进制浮点格式(IEEE 754双精度)。您可以使用上述任何一种方法在您的盒子上确认这一点,或者如果您的盒子是一个例外,则可以找到使用中的精确近似值。

我不喜欢这个答案-它完全是波浪形的,不能真正解释原因。“嗯,以弧度表示的tan(π/2)本质上是无限的,不是吗?”没有解释为什么——正如OP在这里所问的那样——答案实际上不是
np.inf
。但很简单的一点是,不仅要解释为什么它不是,还要解释为什么答案正是人们所看到的——我就是这么做的;-)@蒂姆·彼得斯——这是非常清楚的。为了完整性,我猜测
np.pi
的这种表示形式是最接近系统ε的有理表示形式?假设
np.pi
与Python的
math.pi
具有相同的值(我没有检查,但您可以;-),它是与平台本机
C double
浮点格式中可表示的数学pi最接近的值。这意味着IEEE 754现在在几乎所有的盒子上都是双精度的,因此最接近的二进制浮点具有53位(尾数)精度。因此,有理数集被限制为
+/-I*2**J
的形式,其中整数
I
为0或
2**52,这就是为什么我希望更普遍地实现“二进制”三角函数。由于π永远不能用有理数表示,因此使用一组在0到1的角度上操作的函数会很方便。好吧,它们导入了
np.pi
,而不是
math.pi
。@ρρικΚωνσταντττόπολος
math.pi
np.pi
,以及
scipy.pi
都是一样的;它们被复制只是为了命名方便;
true    3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
                         ^