首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将浮点数相乘产生零

将浮点数相乘产生零
EN

Stack Overflow用户
提问于 2013-01-12 05:24:58
回答 2查看 197关注 0票数 0

下面的代码输出0.0。这是因为溢出吗?如何避免呢?若否,原因为何?

代码语言:javascript
复制
p ((1..100000).map {rand}).reduce :*

我希望能加速这段代码:

代码语言:javascript
复制
p r.reduce(0) {|m, v| m + (Math.log10 v)}

并使用下面的代码:

代码语言:javascript
复制
p Math.log10 (r.reduce :*)

但显然这并不总是可能的.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-12 05:36:02

rand产生的值都在0.0到1.0之间。这意味着在每次相乘时,你的数字会变得更小。所以当你乘以1000的时候,它可能和0很难区分。

在某些时候,ruby会认为你的数字太小了,以至于它是0。例如:2.0e-1000 # => 0

票数 3
EN

Stack Overflow用户

发布于 2013-01-12 06:10:11

Ruby提供了BigDecimal类,该类实现了精确的浮点运算。

代码语言:javascript
复制
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 :*通话在我的电脑上持续了几分钟,最后我中断了通话。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14286880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档