下面的代码输出0.0。这是因为溢出吗?如何避免呢?若否,原因为何?
p ((1..100000).map {rand}).reduce :*我希望能加速这段代码:
p r.reduce(0) {|m, v| m + (Math.log10 v)}并使用下面的代码:
p Math.log10 (r.reduce :*)但显然这并不总是可能的.
发布于 2013-01-12 05:36:02
rand产生的值都在0.0到1.0之间。这意味着在每次相乘时,你的数字会变得更小。所以当你乘以1000的时候,它可能和0很难区分。
在某些时候,ruby会认为你的数字太小了,以至于它是0。例如:2.0e-1000 # => 0
发布于 2013-01-12 06:10:11
Ruby提供了BigDecimal类,该类实现了精确的浮点运算。
require 'bigdecimal'
n = 100
decimals = n.times.map { BigDecimal.new rand.to_s }
result = decimals.reduce :*
result.nonzero?.nil? # returns nil if zero, self otherwise
# => false
result.precs # [significant_digits, maximum_significant_digits]
# => [1575, 1764]
Math.log10 result
# => -46.8031931083014然而,它比本机浮点数慢得多。使用n = 100_000时,decimals.reduce :*通话在我的电脑上持续了几分钟,最后我中断了通话。
https://stackoverflow.com/questions/14286880
复制相似问题