此问题已在此处有答案:
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
5条答案
按热度按时间epggiuax1#
mpmath可以是答案
Mpmath是一个用于多精度浮点运算的纯Python库。它提供了一组广泛的超越函数,无限的指数大小,复数,区间算术,数值积分和微分,求根,线性代数等等。
http://code.google.com/p/mpmath/
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。
iq0todco3#
浮点运算根据定义并不是完全100%准确的,因为值表示为分数。看看关于Python float limitations的文章,以及另一个more general article。
eqqqjvef4#
我尝试使用以下值(我为
a
选择了 * 几十万 *,因为这与您的描述一样具体):计算内部值:
和指数:
将指数乘以
a
:最后的答案:
这些值在Excel中会得到什么?或者,张贴什么值的
a
您实际使用,我会更新我的答案。现在,当人们在他们的评论中问你这个问题时,你已经回避了这个问题,但是如果你想让我们弄清楚为什么在Excel中会有不同,你需要告诉我们你是如何在Excel中进行计算的。这意味着您要放入单元格中以生成值的公式。告诉我们 * 它们是完全一样的 * 是没有用的,因为它没有给予我们任何继续下去的东西。从这里,我的猜测是,他们实际上是不一样的,因为我认为它不太可能浮点错误或类似的将是一个错误的大小,你在你的问题报告的原因。更有可能的是你在某个地方有错别字或误解。
wi3ka0sx5#
如果您只需要任意精度的算术,请使用
fractions
模块中的Fraction
类,它是标准库的一部分。当你完成你的计算后,你可以将它转换为浮点数(如果你必须的话)。不幸的是,最终的浮点数可能不是任意精度的,但是直到转换为浮点数之前的所有计算都是,因此您的浮点数可能比您一直使用浮点数更准确。真的,如果你不关心视觉效果,只要保持数字分数的整个时间,你的问题就解决了。如果你真的关心看到小数点,你需要意识到在这种情况下,任意精度将是一个相当复杂的过程,因为你必须处理重复的值(比如三分之一是一堆永远的三,在
0.
之后)。尽管如此,还是有人试图解决这个问题。让它精确到某个小数点当然是可能的,但如果你不使用分数,不要期望更多。分数有分子和分母(我相信它们被存储为长整型,Python中的长整型已经是任意精度;所以,你可以有你喜欢的分子和分母一样大的数字)。我写了一些代码来将分数从
1234/12
风格转换为2 3/4
风格。但是,我不想通过在这里发布它来给予它一个CC许可证(我宁愿一个真实的的软件许可证,比如MIT)。如果你有兴趣就告诉我。以下是如何使用
fractions.Fraction
的示例:无论如何,你可以把它们当作任何其他类型的数字。你可以像转换整数一样将事物转换为分数(例如
Fraction(4.2343)
将浮点数转换为分数)。你也可以把它们四舍五入。我发现分数类被大大低估了。我经常用它。太棒了。