编写一个函数来计算给定数字的以 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
可能有更好的方法,涉及更少的函数调用,但这是我现在能想到的。
我是 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
可能有更好的方法,涉及更少的函数调用,但这是我现在能想到的。