如何在Python中使用精确的浮点运算?[副本]

brqmpdu1  于 2023-09-29  发布在  Python
关注(0)|答案(5)|浏览(129)

此问题已在此处有答案

Is floating point arbitrary precision available?(5个答案)
五年前就关门了。
我在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和。所以((x-m)110.0(1-m))**B和((x-m)110.0(1-m))**c与它们的excel计算值完全相同,但当它们乘以大数字时,它们完全改变了。
我该怎么做?我必须使用不同的语言吗?这个问题只存在于Python中,还是存在于所有语言中?
编辑:Excel中的公式与Python中的公式完全相同。完全一样在我乘以a和-a之前,数字也是一样的。那么他们都落后了5个百分点。对于x=0.5和m = 0.265,Excel中的答案约为0.47,而Python的答案约为-0.67

epggiuax

epggiuax1#

mpmath可以是答案
Mpmath是一个用于多精度浮点运算的纯Python库。它提供了一组广泛的超越函数,无限的指数大小,复数,区间算术,数值积分和微分,求根,线性代数等等。
http://code.google.com/p/mpmath/

dluptydi

dluptydi2#

这是很难理解你在寻找什么精度,但我认为你也可以看看十进制模块。-
与float数据类型相比,它提供了几个优点:
十进制“是基于一个浮点模型,它是为人们设计的,并且必须有一个最重要的指导原则-计算机必须提供一种算术,它的工作方式与人们在学校学习的算术相同。
十进制数可以精确地表示。相比之下,像1.1和2.2这样的数字在二进制浮点中没有精确的表示。最终用户通常不会期望1.1 + 2.2显示为3.300000000000003,因为它使用二进制浮点。
精确性延续到算术中。在十进制浮点数中,0.1 + 0.1 + 0.1 - 0.3正好等于零。在二进制浮点中,结果是5.5511151231257827e-017。虽然接近于零,但差异阻止可靠的相等性测试,并且差异可以累积。因此,十进制在具有严格等式不变式的会计应用程序中是首选的。
十进制模块包含有效位的概念,因此1.30 + 1.20等于2.50。保留尾随零以指示有效性。这是货币应用程序的习惯表示。对于乘法,“教科书”方法使用被乘数中的所有数字。例如,1.3 * 1.2得到1.56,而1.30 * 1.20得到1.5600。

iq0todco

iq0todco3#

浮点运算根据定义并不是完全100%准确的,因为值表示为分数。看看关于Python float limitations的文章,以及另一个more general article

eqqqjvef

eqqqjvef4#

我尝试使用以下值(我为a选择了 * 几十万 *,因为这与您的描述一样具体):

>>> a = 500000.0
>>> b = 1.0000002
>>> c = 0.9999998
>>> x = 0.5
>>> m = 0.265

计算内部值:

>>> inner = (x - m) * 110.0 * (1 - m)
>>> print inner
18.99975

和指数:

>>> exponent1 = inner**b
>>> exponent2 = inner**c
>>> print (exponent1, exponent2)
(18.999761188674185, 18.999738811332392)

将指数乘以a

>>> aexp1 = -a * exponent1
>>> aexp2 = a * exponent2
>>> print (aexp1, aexp2)
(-9499880.5943370927, 9499869.4056661967)

最后的答案:

>>> final = aexp1 + aexp2
>>> print final
-11.188670896

这些值在Excel中会得到什么?或者,张贴什么值的a您实际使用,我会更新我的答案。
现在,当人们在他们的评论中问你这个问题时,你已经回避了这个问题,但是如果你想让我们弄清楚为什么在Excel中会有不同,你需要告诉我们你是如何在Excel中进行计算的。这意味着您要放入单元格中以生成值的公式。告诉我们 * 它们是完全一样的 * 是没有用的,因为它没有给予我们任何继续下去的东西。从这里,我的猜测是,他们实际上是不一样的,因为我认为它不太可能浮点错误或类似的将是一个错误的大小,你在你的问题报告的原因。更有可能的是你在某个地方有错别字或误解。

wi3ka0sx

wi3ka0sx5#

如果您只需要任意精度的算术,请使用fractions模块中的Fraction类,它是标准库的一部分。当你完成你的计算后,你可以将它转换为浮点数(如果你必须的话)。不幸的是,最终的浮点数可能不是任意精度的,但是直到转换为浮点数之前的所有计算都是,因此您的浮点数可能比您一直使用浮点数更准确。
真的,如果你不关心视觉效果,只要保持数字分数的整个时间,你的问题就解决了。如果你真的关心看到小数点,你需要意识到在这种情况下,任意精度将是一个相当复杂的过程,因为你必须处理重复的值(比如三分之一是一堆永远的三,在0.之后)。尽管如此,还是有人试图解决这个问题。让它精确到某个小数点当然是可能的,但如果你不使用分数,不要期望更多。
分数有分子和分母(我相信它们被存储为长整型,Python中的长整型已经是任意精度;所以,你可以有你喜欢的分子和分母一样大的数字)。我写了一些代码来将分数从1234/12风格转换为2 3/4风格。但是,我不想通过在这里发布它来给予它一个CC许可证(我宁愿一个真实的的软件许可证,比如MIT)。如果你有兴趣就告诉我。
以下是如何使用fractions.Fraction的示例:

from fractions import Fraction
x=Fraction("2.234532456345265356356356354624356356235635634563563565635645") #You can add string numbers of any value.
y=Fraction(1, 3234524352345) #This is one 3234524352345th 
x+=5 #adding five (The five doesn't have to be a Fraction object, but the result will be one.)
y=x/y #Dive x by y.
x=float(x) #Converting it into a float

无论如何,你可以把它们当作任何其他类型的数字。你可以像转换整数一样将事物转换为分数(例如Fraction(4.2343)将浮点数转换为分数)。你也可以把它们四舍五入。
我发现分数类被大大低估了。我经常用它。太棒了。

相关问题