对16331239353195370.0有特殊意义吗?

使用import numpy as np我注意到了

 np.tan(np.pi/2) 

给出标题中的数字,而不是np.inf

 16331239353195370.0 

我很好奇这个数字。 它与某些系统机器精度参数有关吗? 我能从一些东西来计算吗? (我正在思考类似于sys.float_info的东西)

编辑:相同的结果确实可以在其他环境中重现,如Java,octace,matlab …build议的诱惑并不能解释为什么。

pi不能完全表示为Python float(与平台C的doubletypes相同)。 使用最接近的可表示的近似值。

这里是我的盒子上使用的确切的近似值(可能与您的盒子相同):

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

为了find这个比例的正切值,我现在要切换到wxMaxima:

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

所以基本上和你所得到的一样。 所使用的pi/2的二进制近似值比pi/2的math(“无限精度”)值pi/2 。 所以你得到一个非常大的切线,而不是infinity 。 计算出的tan()适用于实际input!

由于完全相同的原因,例如,

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

不返回0.近似值math.pipi小一点,显示的结果是正确的。

其他的方式看math

有几种方法可以看到使用的确切近似值:

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

math.pi完全等于该比率的math(“无限精度”)值。

或者用hex符号表示一个确切的浮点数:

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

或者以几乎所有人最容易理解的方式:

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

尽pipe可能不会立即显而易见,但每个有限的二进制浮点数都可以精确地表示为有限的十进制浮点数(反之不是这样;例如,小数点0.1不能完全表示为有限二进制浮点数),而Decimal(some_float)构造函数产生确切的等值。

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

 true 3.14159265358979323846264338327950288419716939937510... math.pi 3.141592653589793115997963468544185161590576171875 ^ 

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