我正在尝试计算math.tan(0.000000001)
,我得到0.00000001
>>> math.tan(0.00000001) == 0.00000001
True
这是由于如何数学。谭实现了吗?用小角度近似吗?
我在哪里可以得到更多关于这个的文档
一种方法是,通过类比numpy。Expm1,实现一个以双精度计算tan(x)-x的函数。
虽然那天晚上的生产质量版本很棘手,但这里有一个简单的版本,应该能给出关于|x| <1 e-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)
这没什么特别的。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选择以这种方式打印它。