如何在Python中使用精确的浮点运算?

0 投票
5 回答
12974 浏览
提问于 2025-04-16 20:44

我在用Python做浮点数运算时遇到了一些问题。我要解决的方程是这样的:

-a *((x-m)*110.0*(1-m))**b +a*((x-m)*110.0*(1-m))**c
a is a really large positive number (in the hundred thousands)
b is 1.0000002
c is 0.9999998

在Excel中做这个计算时,我得到的结果很准确,但在Python中却完全不准确。

每个部分的结果都是一样的,直到我乘以-a和a。所以((x-m)110.0(1-m))**b和((x-m)110.0(1-m))**c的结果和Excel计算的值完全一样,但当它们乘以一个大数时,结果就完全变了。

我该怎么做呢?我需要用其他语言吗?这个问题只是出现在Python中,还是在所有语言中都有?

补充说明:在Excel和Python中,方程是完全一样的,数字也是一样的,直到我乘以a和-a。然后它们的结果相差大约5点多。在Excel中,当x=0.5和m=0.265时,结果大约是0.47,而在Python中结果大约是-0.67。

5 个回答

2

浮点数运算本质上并不是完全准确的,因为它们是以分数的形式来表示的。你可以看看关于 Python浮点数限制 的文章,还有另一篇 更一般的文章

4

mpmath 可能是个不错的选择

mpmath 是一个纯 Python 编写的库,用于进行高精度的浮点数运算。它提供了丰富的超越函数,支持无限大的指数,处理复杂数,区间运算,数值积分和微分,求解方程,线性代数等等,功能非常强大。

http://code.google.com/p/mpmath/

5

要理解你想要的精度其实挺难的,不过我觉得你可以看看decimal模块

这个模块相比于float数据类型有几个优点:

Decimal(十进制)是基于一种浮点模型,这种模型是为了人类设计的,主要原则是——计算机的算术运算要和人们在学校学到的算术运算一样。

十进制数字可以被精确表示。比如,像1.1和2.2这样的数字在二进制浮点数中没有精确的表示。普通用户通常不会希望1.1 + 2.2的结果显示为3.3000000000000003,这在二进制浮点数中是这样的。

这种精确性也体现在算术运算中。在十进制浮点数中,0.1 + 0.1 + 0.1 - 0.3的结果正好是零。而在二进制浮点数中,结果是5.5511151231257827e-017。虽然这个结果接近于零,但这种差异会导致无法可靠地进行相等测试,而且差异可能会累积。因此,在会计应用中,十进制更受欢迎,因为这些应用对相等性有严格的要求。

decimal模块还引入了有效位的概念,比如1.30 + 1.20的结果是2.50。末尾的零被保留来表示其重要性。这是货币应用中常见的表示方式。在乘法运算中,“学校书本”方法会使用所有的数字。例如,1.3 * 1.2的结果是1.56,而1.30 * 1.20的结果是1.5600。

撰写回答