我在其他问题中读到,例如sin(2π)由于浮点表示而不是零,但非常接近。这个很小的错误在我的代码中是没有问题的,例如,我可以四舍五入小数。
但是,当将2π与非常大的数字相乘时,误差会放大很多。答案应该为零(或接近),但距离很远。
我的想法根本上是做错了吗?如果不是,如何避免周期为(2 * PI * X)→∞的π浮点数的误差容限被“放大”?
请注意,最后3个结果都是相同的。任何人都可以解释为什么即使5)PI / 2确实大于4)还是为什么?即使窦房曲线有很大的偏移,PI / 2的增加仍应产生不同的数字,对吗?
检查小数SIN(2 * PI)
print math.sin(math.pi*2)
结果= -2.44929359829e-16如预期→对于我的目的,此错误余量可以
将PI / 2添加到上面的代码中:SIN(2 * PI + PI / 2)
print math.sin((math.pi*2)+(math.pi/2))
结果:1.0预期
检查非常大的数字SIN(2 * PI * VERY LARGE NUMBER)(仍然期望接近于零)
print math.sin(math.pi*2*(415926535897932384626433832795028841971693993751))
结果:-0.759488037749不是预期的->对于我来说,此错误余量不正确
将PI / 2添加到上面的代码中:SIN(2 * PI * VERY LARGE NUMBER + PI / 2)(预期接近1)
print math.sin((math.pi*2*(415926535897932384626433832795028841971693993751))+(math.pi/2))
如上,但我添加了PI / 2-期望得到1.0
结果:-0.759488037749出乎意料-为什么当我添加PI / 2时,结果与上述相同(应该在窦曲线上移四分之一)
将随机数(8)加到非常大的数上,期望既不为1也不为0
print math.sin(math.pi*2*(415926535897932384626433832795028841971693993759))
如上,但我加了8-期望既不为0也不为1
结果:-0.759488037749不是预期的-为什么当我添加8时,结果与上面相同
python参考方案
这根本不能用于双精度变量。
math.pi
的值仅正确到大约16位小数(二进制为53位),因此,将其乘以415926535897932384626433832795028841971693993751(159位)之类的数字时,将不可能获得有意义的结果。
您需要改用任意精度的数学库。例如,尝试使用mpmath
。告诉它您想要1000比特的精度,然后再次尝试求和:
>>> import mpmath
>>> mpmath.mp.prec=1000
>>> print(mpmath.sin((mpmath.pi*2*(415926535897932384626433832795028841971693993751))+(mpmath.pi/2)))
1.0
如何在Raspberry Pi上保护我的Python脚本? - python我已经在Python上开发了一个漫长而复杂的计算机视觉算法。我坚持“冗长而复杂”,因为我的最后一个解决方案是用C ++重写它(大约3000行,并且依赖于纯Python库)...该算法嵌入在Raspberry Pi A +中。可以将SD卡插入此纳米计算机,使其包含Linux系统。因此,基本上我的脚本位于该SD的文件夹中。打开Raspberry Pi时,它将运行…
从Raspberry PI 3到Arduino UNO的串行通信丢失字节 - python因此,我在Uni拥有一个OpenCV项目,我们在其中使用Raspberry Pi和Arduino构建流光溢彩的系统,以及具有144个LED和网络摄像头的LED灯带。我基本上是通过网络摄像头,OpenCV和Python从电视屏幕的边框读取144个RGB值的,并将它们(包括位置(索引从0到143))通过USB通过USB发送到Arduino。然后,Arduino设…
如果给定一个非常接近0的值,则在函数内舍入一个数字。 - pythonThis question already has answers here: How to round up a complex number? (3个答案) 在8个月前关闭。 我是python的新手,我想弄清楚如何在此函数内四舍五入一个数字。from math import * import math def complex_image(x,y,modu…
Python sqlite3数据库已锁定 - python我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…
Python pytz时区函数返回的时区为9分钟 - python由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…