Ruby中不使用默认运算符的指数公式
如何在不使用Ruby中不使用默认运算符的指数公式,ruby,Ruby,如何在不使用**运算符的情况下使用方法计算指数。假设方法名calculate(a,b),其中a是基,b是指数值 a和b的值可以是正整数或负整数、小数等 谢谢Math.exp(b*Math.log(a))能满足您的需要吗?请注意,虽然这适用于非整数a和b,但它需要a>0。它还受到浮点运算的有限精度限制 在b为整数的限制下,以下递归解有效且为O(logb),即渐近快于重复乘法: def calculate(a, b) return 1.0 / calculate(a, -b) if b <
**
运算符的情况下使用方法计算指数。假设方法名calculate(a,b)
,其中a
是基,b
是指数值
a
和b
的值可以是正整数或负整数、小数等
谢谢Math.exp(b*Math.log(a))能满足您的需要吗?请注意,虽然这适用于非整数a
和b
,但它需要a>0
。它还受到浮点运算的有限精度限制
在
b
为整数的限制下,以下递归解有效且为O(logb
),即渐近快于重复乘法:
def calculate(a, b)
return 1.0 / calculate(a, -b) if b < 0
if b == 0
1
elsif b.even?
calculate(a * a, b / 2)
else
a * calculate(a, b - 1)
end
end
def计算(a、b)
返回1.0/如果b<0,则计算(a,-b)
如果b==0
1.
艾尔希夫b.平吗?
计算(a*a,b/2)
其他的
a*计算(a,b-1)
结束
结束
a
的值可以是整数或小数,也可以是正数或负数。
如果您担心精度问题,您还可以将return
语句更改为returnrational(1,calculate(a,-b)),如果b<0
Math.exp(b*Math.log(a))能满足您的需要吗?请注意,虽然这适用于非整数a
和b
,但它需要a>0
。它还受到浮点运算的有限精度限制
在
b
为整数的限制下,以下递归解有效且为O(logb
),即渐近快于重复乘法:
def calculate(a, b)
return 1.0 / calculate(a, -b) if b < 0
if b == 0
1
elsif b.even?
calculate(a * a, b / 2)
else
a * calculate(a, b - 1)
end
end
def计算(a、b)
返回1.0/如果b<0,则计算(a,-b)
如果b==0
1.
艾尔希夫b.平吗?
计算(a*a,b/2)
其他的
a*计算(a,b-1)
结束
结束
a
的值可以是整数或小数,也可以是正数或负数。
如果您担心精度问题,您还可以将return
语句更改为returnrational(1,calculate(a,-b)),如果b<0
那么:
def calculate(a,b)
b.times.reduce(1) { |acc, _| acc * a }
end
我认为它很容易阅读,并且可以清楚地显示指数定义。如何:
def calculate(a,b)
b.times.reduce(1) { |acc, _| acc * a }
end
我认为它很容易阅读,并且可以清晰地显示指数定义。与Wand maker建议的解决方案完全相同,创建阵列的语法不同:
Array.new(b, a).reduce(&:*)
另一个使用枚举器的解决方案(应该更快):
b、 times返回一个枚举数,该枚举数产生值0到b-1(结果是b值)
reduce with a block的使用最好从其文档中进行解释:与Wand maker建议的解决方案完全相同,创建阵列的语法不同:
Array.new(b, a).reduce(&:*)
另一个使用枚举器的解决方案(应该更快):
b、 times返回一个枚举数,该枚举数产生值0到b-1(结果是b值)
reduce与块的用法最好从它的文档中解释:谢谢!它的工作很好,除了给我81.00000000000003的值时,使用3为基础,4为指数值。谢谢!它的工作很好,除了给我81.00000000000003的值时,使用3为基数和4为指数值。这两个解决方案都非常好!喜欢第一个中创建数组的方式。你能解释一下第二个吗?两个解决方案都很好!喜欢在第一个问题中创建数组的方式。您能解释第二个问题吗?如果对
a
和/或b
有限制,您的问题中应该包括这些限制@WandMaker在下面的评论中提到,之前有一条评论称b
是整数,但该评论已被删除。如果a
和/或b
有限制,则应将其包括在您的问题中@WandMaker在下面的评论中提到,之前有一条评论称b
为整数,但该评论已被删除。