【问题标题】:Write a function that calculates log base 2 of a given number编写一个函数,计算给定数字的以 2 为底的对数
【发布时间】:2021-02-11 22:54:09
【问题描述】:

我是 python 的新手,很抱歉这是一个非常简单的问题。

问题:我们被要求编写一个自定义函数,在给定x 的情况下计算log_2(x) = b 中的b(x 的对数基数2)。

注意:变量x 以float 形式给出,我们不能使用任何python 的内置函数,如pow() 或导入任何包。

示例:

Given 8, return "3"
Given 9, return "between 3 and 4"
Given 0.4, return "between -1 and -2"

所有返回类型都采用字符串的格式(我们可以使用 str())。

我的尝试: 因为log_2(x) = b 本质上等于2^b = x,所以我尝试迭代值b 并查看x 值是否等于给定数字。但是,我忘记了给定的数字是浮点数,而不是整数。

def log_base_2(number: float) -> str:
    power = 0
    BASE = 2

    if number <= 0:
        raise Exception('Sorry, your input is incorrect!') 

    while True:
        if number == calc_power(BASE, power):
            return str(power)
        elif number > calc_power(BASE, power) and number < calc_power(BASE, power + 1):
            return f"between {power} and {power + 1}"
        else:
            power += 1
 

# helper method for calculating the power
def calc_power(base: float, power: float):
    if power == 0:
        return 1

    multiple = base
    for i in range (1, power):
        base *= multiple 
    return base

这基本上不起作用,因为我只考虑了整数并且它无法计算浮点数。

我不太确定如何编写一个指数计算器来计算浮点型幂。感谢您的帮助,如果您有更简单的方法来解决此问题,请告诉我!

【问题讨论】:

  • 您能否举几个例子,说明您的代码结果与应有的不同?

标签: python logic calculator


【解决方案1】:

这是通过重写您当前的函数得到的答案:

def log_base_2(number: float) -> str:
    power = 0
    BASE = 2
    power2 =0
    # create new power variable that counts -ve

    if number <= 0:
        raise Exception('Sorry, your input is incorrect!') 

    while True:
        if number == calc_power(BASE, power):
            return str(power)
        elif number > calc_power(BASE, power) and number < calc_power(BASE, power + 1):
            return f"between {power} and {power + 1}"
        elif number < calc_power(BASE, power2) and number > calc_power(BASE, power2-1):
            return f"between {power2} and {power2-1}"
        # this elif wants to also check powers in the negative direction
        else:
            power += 1
            power2 -= 1
            # increment -ve power
 

# helper method for calculating the power
def calc_power(base: float, power: float):
    if power == 0:
        return 1
    multiple = base
    
    if power < 0: # check for -ve powers
            power *= -1 # change power to +ve
            for i in range(power,1,-1): # loop backwards
                multiple *= 2 # 2^power
            base = (1 / multiple) # to be a -ve power, it must be inverse
    else:
        for i in range (1, power):
            base *= multiple
    return base

可能有一种更好的方法,涉及更少的函数调用,但这是我现在能想到的。

【讨论】:

  • 感谢您的帮助!我确实有一个问题。当我分离calc_power(base, power)函数并尝试calc_power(3, -5)时,结果与实际不同。
  • 很可能是multiple *= 2 这一行。它是在考虑 base 2 的情况下编写的,但它应该很容易修复。将 2 更改为基数。
猜你喜欢
  • 1970-01-01
  • 2022-11-17
  • 2016-07-08
  • 2021-03-17
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
相关资源
最近更新 更多