如何避免math.sin(math.pi * 2 * VERY LARGE NUMBER)的错误裕度比math.sin(math.pi * 2)大得多? - python

我在其他问题中读到,例如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的值,则在函数内舍入一个数字。 - python

This 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…