想知道是否有办法编写一个方法,在不使用操作符号(*
)的情况下对数字(整数或十进制/浮点数)进行平方。例如:2
的平方为4
,2.5
的平方为6.25
,3.5
的平方为12.25
。< / p>
这是我的方法:
def square(num)
number = num
number2 = number
(1...(number2.floor)).each{ num += number }
num
end
puts square(2) #=> 4 [Correct]
puts square(16) #=> 256 [Correct]
puts square(2.5) #=> 5.0 [Wrong]
puts square(3.5) #=> 10.5 [Wrong]
代码适用于整数,但不适用于浮点数/小数。我在这做错了什么?此外,如果有人对这个问题采取新的方法,那么请分享。算法也很受欢迎。此外,考虑到该方法的性能将是一个加号。
答案 0 :(得分:9)
你可以使用一些技巧,按照增加的技巧排列在这里。
观察k * k = e^log(k*k) = e^(log(k) + log(k))
,并使用该规则:
Math.exp(Math.log(5.2) + Math.log(5.2))
# => 27.04
这里没有乘法!
正如另一位意见提供者建议的那样,你可以采取相互操作,除法:k/(1.0/k) == k^2
。但是,这会引入额外的浮点错误,因为k / (1.0 / k)
是两个浮点运算,而k * k
只有一个。
或者,因为这是Ruby,如果您想要与浮点运算完全相同的值并且您不想使用乘法运算符,则可以使用指数运算符:k**2 == k * k
。
如果你自己不这样做,那就不会倍增!
require 'wolfram' # https://github.com/cldwalker/wolfram
query = 'Square[5.2]'
result = Wolfram.fetch(query)
最后,如果你感觉真的很便宜,你可以避免实际使用文字“*”操作,并使用等效的东西:
n = ...
require 'base64'
n.send (Base64.decode64 'Kg==').to_sym, n # => n * n
答案 1 :(得分:4)
没有使用任何操作标志。
def square(num)
num.send 42.chr, num
end
答案 2 :(得分:3)
嗯,乘法的逆是除法,所以你可以通过除以它的倒数得到相同的结果*。那就是:square(n) = n / (1.0 / n)
。只要确保你不会无意中进行整数除法。
*技术上划分两次为浮点运算中的舍入误差提供了第二次机会,因为它执行了两次运算。因此,这不会产生完全与浮点乘法相同的结果 - 但这也不是问题中的要求。