【发布时间】:2018-01-22 01:21:20
【问题描述】:
如果你取一个数,取它的平方根,去掉小数,然后将它提高到二次方,结果应该总是小于或等于原来的数。
这在 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.
看起来math.pow(math.floor(math.sqrt(99999999999999975425)), 2) 返回1e+20。
我认为这与我们在 python 中存储值的方式有关......与浮点运算有关,但我无法具体解释这对这种情况有何影响。
【问题讨论】:
-
请注意,尽管
4503599761588224及其平方根的下限(67108864)都足够小,但在大多数机器上您也会得到n = 4503599761588224的例外情况在 IEEE 754 binary64 浮点中精确表示。因此,它比仅使用大于浮点可以表示的数字更微妙。 -
(顺便说一句,我认为这里的副本不合适。对于该副本的答案中未包含的特定问题,还有很多有用的内容可以说。)跨度>