首页 > 解决方案 > math.log 的错误输出

问题描述

我正在尝试计算最接近的 2^n 到一个非常大的数字(<=10^19)

我曾尝试使用 math.log(number,2)。但这对于非常大的数字给出了错误的结果。我应该如何在不使用其他库的情况下做到这一点?

a = 9843649374639837463  # a is any num between 1 and 10^9
number = int(math.log(a,2))

标签: pythonpython-3.xfloating-pointprecisionlogarithm

解决方案


大整数输入被转换为精度有限的浮点数,因此丢失了一些输入精度。此外,math.log2()可能比math.log()更准确,因为它针对基数 2 进行了微调。

有一个int方法将是准确的,bit_length()

>>> a = 9843649374639837463
>>> a.bit_length()
64
>>> bin(a)
'0b1000100010011011101010101111001111001100111001110101000100010111'

请注意,浮点日志非常接近但不准确:

>>> a = 9843649374639837463
>>> 2.0 ** math.log2(a)
9.843649374639845e+18
>>> abs(a - 2.0 ** math.log2(a))
8192.0

推荐阅读