Math.tan 用于小角度。 python是否使用小角度近似?
Math.tan for small angles. Does python use small angle approximation?
我正在尝试计算 math.tan(0.000000001)
,我得到 0.00000001
>>> math.tan(0.00000001) == 0.00000001
True
这是由于 math.tan 的实施方式造成的吗?它使用small-angle approximation吗?
在哪里可以获得更多关于此的文档
这没什么特别的。 Python 的 float
精度有限,我们可以用 numpy 探索一下:
0.000000010000000000000000209226 # np.tan(0.00000001)
0.000000009999999999999998554864 # np.nextafter(np.tan(0.00000001), -1)
0.000000010000000000000001863587 # np.nextafter(np.tan(0.00000001), 1)
0.000000010000000000000000333... # True value
从这里我们可以看出 0.000000010000000000000000209226
是最接近真实值的表示,而且将其往返到 0.00000001
是安全的,因此 Python 选择那样打印。
一种方法是,通过类比 numpy.expm1,实现一个以双精度计算 tan(x)-x 的函数。
虽然当晚的制作质量版本很棘手,但这里有一个简单的版本,应该可以为 |x| 提供准确的答案< 1e-6
tan(x)-x = sin(x)/cos(x) - x = (sin(x)-x*cos(x))/cos(x)
对于这么小的 x 我们可以写,比双精度更好
sin(x) = x - x*x*x/6 + x*x*x*x*x/120
cos(x) = 1 - x*x/2 + x*x*x*x/24
代入这些我们得到
tan(x)-x = x*x*x*(1.0/3 - (1.0/30)*x*x)/cos(x)
我正在尝试计算 math.tan(0.000000001)
,我得到 0.00000001
>>> math.tan(0.00000001) == 0.00000001
True
这是由于 math.tan 的实施方式造成的吗?它使用small-angle approximation吗?
在哪里可以获得更多关于此的文档
这没什么特别的。 Python 的 float
精度有限,我们可以用 numpy 探索一下:
0.000000010000000000000000209226 # np.tan(0.00000001)
0.000000009999999999999998554864 # np.nextafter(np.tan(0.00000001), -1)
0.000000010000000000000001863587 # np.nextafter(np.tan(0.00000001), 1)
0.000000010000000000000000333... # True value
从这里我们可以看出 0.000000010000000000000000209226
是最接近真实值的表示,而且将其往返到 0.00000001
是安全的,因此 Python 选择那样打印。
一种方法是,通过类比 numpy.expm1,实现一个以双精度计算 tan(x)-x 的函数。
虽然当晚的制作质量版本很棘手,但这里有一个简单的版本,应该可以为 |x| 提供准确的答案< 1e-6
tan(x)-x = sin(x)/cos(x) - x = (sin(x)-x*cos(x))/cos(x)
对于这么小的 x 我们可以写,比双精度更好
sin(x) = x - x*x*x/6 + x*x*x*x*x/120
cos(x) = 1 - x*x/2 + x*x*x*x/24
代入这些我们得到
tan(x)-x = x*x*x*(1.0/3 - (1.0/30)*x*x)/cos(x)