2024-06-02 08:42:28 发布
网友
使用import numpy as np我注意到
import numpy as np
np.tan(np.pi/2)
给出标题中的数字,而不是np.inf
np.inf
16331239353195370.0
我对这个号码很好奇。它与某些系统机器精度参数有关吗?我能从某个方面计算出来吗?(我的思路类似于sys.float_info)
sys.float_info
编辑:相同的结果在其他环境(如Java、octace、matlab)中确实是可重复的。。。不过,这个被暗示的骗局并不能解释原因。
pi不能完全表示为Python float(与平台C的double类型相同)。使用最接近的可表示近似。
pi
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的二进制近似值比pi/2的数学(“无限精度”)值小一点。所以得到一个非常大的切线,而不是infinity。计算出的tan()适合实际输入!
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正好等于该比率的数学(“无限精度”)值。
或作为十六进制表示法中的精确浮点:
>>> math.pi.hex() '0x1.921fb54442d18p+1'
或者以一种最容易被每个人理解的方式:
>>> import decimal >>> decimal.Decimal(math.pi) Decimal('3.141592653589793115997963468544185161590576171875')
虽然这可能不是很明显,但每个有限二进制浮点都可以精确地表示为有限十进制浮点(相反的是不true;例如,十进制0.1不能精确地表示为有限二进制浮点),并且Decimal(some_float)构造函数生成完全等效的。
0.1
Decimal(some_float)
这里是pi的真值,后面是math.pi的精确十进制值,第三行的插入符号指向第一个数字,它们不同:
true 3.14159265358979323846264338327950288419716939937510... math.pi 3.141592653589793115997963468544185161590576171875 ^
math.pi在“几乎所有”框中是相同的,因为几乎所有框现在都使用相同的二进制浮点格式(IEEE 754双精度)。您可以使用上面的任何方法来确认您的框,或者如果您的框是一个异常,则可以找到正在使用的精确近似值。
pi
不能完全表示为Python float(与平台C的double
类型相同)。使用最接近的可表示近似。以下是我的盒子上使用的精确近似值(可能与你的盒子上的相同):
为了找到这个比率的正切,我现在要切换到wxMaxima:
基本上和你得到的一样。使用的
pi/2
的二进制近似值比pi/2
的数学(“无限精度”)值小一点。所以得到一个非常大的切线,而不是infinity
。计算出的tan()
适合实际输入!出于完全相同的原因,例如
不返回0。近似值
math.pi
比pi
小一点,并且显示的结果是正确的。其他看数学的方法.pi
有几种方法可以查看使用中的精确近似值:
math.pi
正好等于该比率的数学(“无限精度”)值。或作为十六进制表示法中的精确浮点:
或者以一种最容易被每个人理解的方式:
虽然这可能不是很明显,但每个有限二进制浮点都可以精确地表示为有限十进制浮点(相反的是不true;例如,十进制
0.1
不能精确地表示为有限二进制浮点),并且Decimal(some_float)
构造函数生成完全等效的。这里是
pi
的真值,后面是math.pi
的精确十进制值,第三行的插入符号指向第一个数字,它们不同:math.pi
在“几乎所有”框中是相同的,因为几乎所有框现在都使用相同的二进制浮点格式(IEEE 754双精度)。您可以使用上面的任何方法来确认您的框,或者如果您的框是一个异常,则可以找到正在使用的精确近似值。相关问题 更多 >
编程相关推荐