【问题标题】:pow() raising to floatspow() 提升为浮点数
【发布时间】:2013-09-21 16:02:15
【问题描述】:

为什么以浮点数表示的整数与以整数形式对相同数字进行求积会产生不同的结果?

例如:

>>> pow(10,25)%195
10L
>>> pow(10,25.0)%195
64.0

我尝试改用mpmath's power(),但得到的数字和第二种形式完全相同。

如何在 Python 中提升到非常大的非整数幂并对其执行 mod(例如,使用纯数学执行类似 RSA 的逻辑所采取的步骤)?

【问题讨论】:

标签: python math


【解决方案1】:

对于整数,可以使用 pow 的 3 参数形式:

pow(10, 25, 195)

您的问题源于浮点数的精度损失。你需要在这里使用decimal.Decimals:

>>> from decimal import Decimal
>>> pow(10, Decimal('25.0')) % 195
Decimal('10')

【讨论】:

    【解决方案2】:

    回答你的问题,因为 Python 中的浮点数是 IEEE754 floats and have limited precision

    >>> int(10**25.0)
    10000000000000000905969664L
    

    如您所见,答案很接近但不正确。

    如何在 Python 中提升到非常大的非整数幂并对其执行 mod(例如,使用纯数学执行类似 RSA 的逻辑所采取的步骤)?

    这是我使用x^(a+b) = x^a * x^b的建议:

    def powmod_f(base, exponent, mod):
        return (pow(base, int(exponent), mod) * (base ** (exponent % 1))) % mod
    

    这仅适用于整数基数,但是,如果您的基数也是浮点数,您将不得不自己实现 powmod 算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-06
      • 2010-12-22
      • 2015-03-21
      • 2022-10-24
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多