1e9+7和10**9+7竟然导致两种结果

练习一个快速幂算法题目的时候发现了这个很有意思的问题,但是我也不知道为什么。代码如下

#快速幂运算
MOD = 10 ** 9 + 7
pow = 10000
def fun(base , power , mod):
    result = 1
    while power > 0:
        if power % 2 != 0:
            result = (result * base) % mod
        power = power // 2
        base = (base * base) % mod
    return result
a = fun(9 , pow , MOD)
b = fun(8 , pow , MOD)
c = fun(7 , pow , MOD)
result = (a - 2 * b + c) % MOD
if result < 0:
    result += MOD
print(result)

要计算的就是9**10000-2*8**10000+7**10000,如果MOD取10**9+7的话,是正确答案157509472。
10**9+7
但是如果改为1e9+7的话,结果就变为了793962873.0了。
1e9+7
这是为什么呢?我觉得很神奇,因为这两个理论上是等价的,只是数据类型不同,求解!

Jason990420
最佳答案

整数运算是精确的,而浮点数运算可能由于浮点数在内存中的表示方式引入精度误差。

>>> (175880701 * 175880701) % (10**9 + 7)
767713261
>>> (175880701.0 * 175880701.0) % (1e9 + 7)
767713260.0

对于有理数运算,可以使用 fractions 模块来避免浮点数误差

from fractions import Fraction

#快速幂运算
pow = 10000
def fun(base , power , mod):
    result = 1
    while power > 0:
        if power % 2 != 0:
            result = (result * base) % mod
        power = power // 2
        base = (base * base) % mod
    return result

for MOD in (10**9 + 7, Fraction(1e9 + 7)):
    a = fun(9 , pow , MOD)
    b = fun(8 , pow , MOD)
    c = fun(7 , pow , MOD)
    result = (a - 2 * b + c) % MOD
    if result < 0:
        result += MOD
    print(result)
157509472
157509472
17小时前 评论
SUPERINF (楼主) 16小时前
讨论数量: 2
Jason990420

整数运算是精确的,而浮点数运算可能由于浮点数在内存中的表示方式引入精度误差。

>>> (175880701 * 175880701) % (10**9 + 7)
767713261
>>> (175880701.0 * 175880701.0) % (1e9 + 7)
767713260.0

对于有理数运算,可以使用 fractions 模块来避免浮点数误差

from fractions import Fraction

#快速幂运算
pow = 10000
def fun(base , power , mod):
    result = 1
    while power > 0:
        if power % 2 != 0:
            result = (result * base) % mod
        power = power // 2
        base = (base * base) % mod
    return result

for MOD in (10**9 + 7, Fraction(1e9 + 7)):
    a = fun(9 , pow , MOD)
    b = fun(8 , pow , MOD)
    c = fun(7 , pow , MOD)
    result = (a - 2 * b + c) % MOD
    if result < 0:
        result += MOD
    print(result)
157509472
157509472
17小时前 评论
SUPERINF (楼主) 16小时前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!