为了找出某个基数中某个数字的位数,我试图写下这行:
numdigits = math.floor(math.log(num, base)) + 1
其中math.log(num, base)
等价于math.log(num)/math.log(base)
但是,在这两种情况下,这有时会导致数字错误。这是因为数学.log是浮点数,因此精度有限。例如,在计算3486784401(3^20)的日志基数3时:
>>> math.log(3486784401, 3)
19.999999999999996
在这里发言将得到19,而正确的答案是20。我知道这是因为浮点数是用二进制表示的,但是我想知道是否有办法解决这个问题。你知道吗
有没有一种方法可以写出一个函数,它以100%的准确度给出任意基数的对数下限?你知道吗
是的,有多种方法。你知道吗
你可以像在你的问题中那样计算位数。然后您可以通过计算
base**result
(整数形式,这样您就可以得到一个精确的结果)并查看它与原始参数的比较来测试您的结果。将result
向上或向下调整1,然后再次测试,直到确定最终结果正确为止。你最多需要3次测试。类似地,您可以跳过
log
测试,只计算base
的幂,直到它达到或超过您的参数。这会使事情完全保持整数状态,但会更加耗时。当然,另一种方法是实际转换成所需的基数,然后检查位数。当然,这更费时。
相关问题 更多 >
编程相关推荐