【问题标题】:Python3 Determine if logarithm is "perfect," i.e., no remainder on floatPython3确定对数是否“完美”,即浮点数没有余数
【发布时间】:2021-05-26 05:23:34
【问题描述】:

问题陈述:

我试图确定一个对数是否“完美”,即没有余数。我遇到的问题是math.log() 总是返回一个浮点数。

我读到这个:https://docs.python.org/3/tutorial/floatingpoint.html

这是我目前的解决方案:

import sys
import math


def is_even_log(argument, base):
    x = math.log(argument, base)  # yields float

    numerator, denominator = x.as_integer_ratio()

    print(
        f"numeratorerator: {numerator}, "
        f"denominatorominator: {denominator}")

    if numerator % denominator == 0:
        print(f"Log base {base} of {argument} is even")
        return True
    else:
        print(f"Log base {base} of {argument} is not even")
        return False


is_even_log(int(sys.argv[1]), int(sys.argv[2]))

问题

只是好奇是否有人有更好的方法来做到这一点?我想我可以访问 PyObject 的某些属性,该属性指示是否存在余数。

【问题讨论】:

  • argumentbase 是整数吗? base 是肯定的吗?对数的“完美”是什么意思?这是否意味着它是一个整数?还是说它是理性的? (4 的以 16 为底的对数正好是 ½。那是“完美的”吗?)
  • @EricPostpischil 好点。我想我应该说“完美”是如果 arg 和 base 都是整数并且 log 是整数。我想我已经写的是最干净的。也许我应该再深入研究一下 float 的实现。我想这真的与对数没有任何关系,更多的是与“如何确定浮动是否没有余数”

标签: python-3.x floating-point logarithm


【解决方案1】:

以 i 为底的 log b 等于 x 等价于 b 等于 i 的 x 次方。所以代码是:

def is_even_log(arg, base):
    x = math.log(arg, base)
    return arg == base ** int(x+1/2) 

由于 int 函数返回浮点数的截断,int(x+1/2) 返回四舍五入的数字。 此解决方案适用于整数(arg 和 base),因为在这种情况下,if 语句是整数之间的比较

不建议测试浮点数的相等性,因为是近似值。

【讨论】:

    【解决方案2】:

    您可以将对数四舍五入到最接近的整数,并通过再次取幂来检查它是否正确:

    def is_even_log(argument, base):
        return argument == base**round(math.log(argument, base))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 2012-01-08
      • 2014-10-06
      相关资源
      最近更新 更多