当前位置: 首页 > 知识库问答 >
问题:

数学中的错误在哪里。sqrt()和数学。pow()来自大数字?[副本]

锺离飞尘
2023-03-14

如果你取一个数字,取它的平方根,去掉小数点,然后把它提高到二次方,结果应该总是小于或等于原来的数字。

这在python中似乎是正确的,直到你出于某种原因在99999999999999975425上尝试它。

import math

def check(n):
    assert math.pow(math.floor(math.sqrt(n)), 2) <= n

check(99999999999999975424)  # No exception.
check(99999999999999975425)  # Throws AssertionError.

它看起来像是数学。pow(数学楼层(数学sqrt(99999999999999975425)),2)返回1e 20

我假设这与我们在python中存储值的方式有关...一些与浮点算术相关的东西,但我不能具体解释这是如何影响这种情况的。

共有2个答案

祁正阳
2023-03-14

与埃文·罗斯(现已删除)的答案声明不同,这不是因为sqrt算法中的epsilon值。

大多数math模块函数将其输入转换为floatmath。sqrt就是其中之一。

999999999999 75425不能表示为浮点。对于该输入,强制转换生成一个具有精确数值99999999999983616的浮点,其repr显示为9.99999998E 19

>>> float(99999999999999975425)
9.999999999999998e+19
>>> int(_)
99999999999999983616L

最接近这个数字平方根的浮点是1000000000.0,这就是math。sqrt返回

全丰
2023-03-14

问题不在于sqrtpow,问题在于您使用的数字大于浮点数所能精确表示的数字。标准的IEEE 64位浮点运算不能表示超过52位(加上一个符号位)的每个整数值。

尝试将您的输入转换为float,然后再转换回来:

>>> int(float(99999999999999975424))
99999999999999967232
>>> int(float(99999999999999975425))
99999999999999983616

如您所见,可表示值跳过了16384。在math.sqrt中的第一步是转换为浮动(C),在那一刻,您的值增加了足以破坏最终结果。

短版本:float无法精确表示大整数。如果需要更高的精度,请使用decimal

 类似资料:
  • 我在python中使用的是200位数字。当用数学求一个数的平方根时。我得到了一个错误的答案。 由于x*x(201位)大于n(200位),因此x的值将大于预期值。这里发生了什么?有没有什么概念我弄错了?我怎样才能找到非常大的数的根呢?

  • ,和? 为什么只获得二次权的复杂根?我应该把它专门用于我的平方根吗?他们在背景中有什么不同?

  • 为什么数学模块返回错误的结果? 结果 在这里,结果是正确的。 结果 这里的结果是不正确的。 为什么会这样呢?

  • 问题内容: 为什么Python的数学错误? 问题答案: 你已达到计算机科学的新水平,并且你正在走向成熟。 因此,你现在可以进行下一步了。BDFL 本人已授权我向你透露以下超级机密文件。古人先理解它,再解密它,现在,你也将如此! http://floating-point-gui.de/basic/ 请谨慎对待本文件!只与你认识的人分享同样令人困惑的结论!

  • 问题内容: 我只是从“ 使用Python进行工程中的数值方法”中 测试一个示例。 当我运行它时,它显示以下错误: 我将其范围缩小到了日志,因为当我删除日志并添加其他功能时,它可以工作。我认为这是由于对底座的某种干扰,我不知道怎么做。谁能提出解决方案? 问题答案: 您的代码执行的a小于或等于零。从数学上来说这是未定义的,因此Python的函数会引发异常。这是一个例子: 不知道函数的作用,我不确定是否

  • 我写了以下代码,在打印了大约10个输出后,它会出错 前三个函数是正确的,在其他程序中工作良好。请不要对它们的结构敏感,我认为问题在于和选择一些不能满足条件的值。我可以添加一些行来告诉Python避免使用导致数学域错误的数字吗?如果是,我应该怎么做?我的意思是通过下导致负值的步骤? 是一个mtrix,是一个31个数字的列表。 输出为: