导航:首页 > 编程语言 > python数据精度

python数据精度

发布时间:2025-07-02 19:29:00

⑴ 关于python浮点数的精度及其造成的问题

在解决学术问题的过程中,Python因为其易用性和语法的简洁性而受到欢迎。然而,在某些实际问题中,由于Python默认的浮点数精度是双精度(64位),直接用此精度会出现非常大的问题。例如,回代根到等式发现等式不成立(从而造成恐慌)。本文记录了一种笔者找到的可能的解决方法用于解决Python精度不够的问题。

Python的默认浮点数是双精度。不过不论是什么精度,浮点数在计算机中都是以二进制保存。这就导致了在有限精度下,电脑为自己把精度范围外的小数“掐掉”,导致结果不准确。以下笔者展现一个经典的例子,0.1 + 0.2,其结果为0.30000000000000004,而不是0.3。

经过一些搜索,发现NumPy提供一个相对更高精度的数值类型numpy.float128()(或者numpy.longdouble(), numpy.longfloat()),它的精度比64位“稍高”。使用numpy.float128()之后,输出的结果更加接近真实值0.3。

这会导致什么问题?在大多数情况下(姑且如此说,毕竟我至今第一次遇到这个问题),不会有很大影响。但这不代表这个问题可以忽略。例如在使用SymPy求解方程时,如果直接使用默认浮点数,得到的结果并不能使等式两边成立。

我们首先尝试将64位浮点数替换为128位浮点数,但不幸的是,这种方法得到的精度提升有限。方程两边仍然无法成立。

通过搜索和求助,我得知了使用decimal包的方法。使用十进制数,这样应该就可以表示准确的小数了。但是如果直接使用SymPy去解方程,仍然不能得到精确结果!我推测SymPy仍然使用了浮点数。

在已知方程系数的情况下,求解方程的根有两种方法。一种是直接使用求根公式,适用于四次及以下的多项式方程。另一种是数值法,可以得到一个自定精度的估计值。

由于Python的decimal包中的Decimal类型的特殊性,许多常用的运算方法并不适用此类数值。接下来记录几种我从官方文档和Wikiversity中找到的常用运算方法。

来自Python官方文档:

来自Wikiversity:

可能有读者会好奇,为什么要摘录arctan()。原因是需要进行复数运算!在次数为2、3、4的一元方程中,非常容易出现复数。我针对自己的问题,对arctan()函数进行了一定的修改,并实现了能够进行复数运算的几种方法。此外,还定义了判断两个数是否相等的函数if_eq()。

到目前为止,我们已经能解决高达四次的一元方程。然而,对于大于或等于五次的多项式来说,现有方法似乎仍然显得黔驴技穷。

在没有求根公式的情况下,数值方法是一个解方程实根的很好途径。我使用了牛顿法来解决问题。参考Kong等人的在线书籍,代码实现如下,

到此为止,我们可以尝试一下,能否使用现有知识求解本文最初设置的方程。首先使用求根公式法,成功得到了方程的解!通过观察可得,仅仅是小数后被掐掉的部分不同,就会造成等式两边产生极大(绝对来说,非相对)的不同!

其次,尝试牛顿数值法。

可以看到,数值法的缺陷是需要设置不同的初值,才能得到不同的实根。但优点是,在计算机性能支持的前提下,可以逼近任意方程的某个根。可能有些读者会好奇,此处的“-10000000000000000000000”为何不需要将其进行“十进制化”?原因是在Python中,整数是精确的,不精确的只是浮点数。

本文讨论了在某些特殊方程中因为Python浮点数不够精确而导致的结果不精确的问题。当对结果的精度要求较高或者根的量级非常大时,推荐使用先求初值、再求精确值的方法进行求解。

阅读全文

与python数据精度相关的资料

热点内容
有ip地址但是dhcp服务器 浏览:443
三星手机加密中断怎么回事 浏览:535
训练模型init源码 浏览:837
程序编译是谁的功能 浏览:502
qq收藏怎样设置加密 浏览:288
服务器的视频怎么保存 浏览:346
下载暗黑2压缩包解压后无法启动 浏览:743
安卓手机删除了的照片怎么找回来 浏览:347
安卓文件夹显示多图 浏览:884
文件夹内变目录 浏览:859
欧盟程序员培训 浏览:183
linux登录ftp命令 浏览:741
群晖如何给一个用户建个文件夹 浏览:248
手机版我的世界空岛战争服务器地址 浏览:556
m4a如何上传到钉钉群文件夹 浏览:605
为什么安卓app更新比苹果快 浏览:960
松下gr7软件怎么编译程序 浏览:473
压缩空气能不能呼吸用 浏览:478
java调用远程接口 浏览:854
java红色的叹号 浏览:378