编写一个函数来计算给定数字的以 2 为底的对数

Write a function that calculates log base 2 of a given number

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

问题: 我们被要求编写一个自定义函数来计算 b in log_2(x) = b 给定 x(log base 2 of x ).

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

示例:

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

所有 return 类型都采用字符串格式(我们可以使用 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

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

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

这是重写当前函数的答案:

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

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