Ruby float to_r 计算。小数化为分数
有人可以澄清为什么 ruby 在使用 to_r 时返回如此大的数字,
例如:
a = 0.025
a.to_r
3602879701896397/144115188075855872.
为什么不使用 1/40?
Can someone clarify why ruby returns such big numbers when using to_r
for example:
a = 0.025
a.to_r
3602879701896397/144115188075855872.
Why not use 1/40?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这听起来像是一个典型的浮点问题,但隐藏在里面。虽然 0.025 可以精确表示,但函数 to_r 无疑会在内部执行各种浮点运算,而这些运算必然是不精确的。结果
3602879701896397/144115188075855872
无疑会比您的提案1/40
更接近地匹配a
的中间转换版本。现在,
3602879701896397/144115188075855872
非常接近于1/40
。但它并不完全相等,所以没有简化。有关更多信息,请查看一些的上一页 与不精确浮点相关的问题。因此,这是一个微妙的案例,也是一个很好的问题,但其基本原理是相同的。我正在研究
Float#to_r
的 rubyC
实现以获取更多详细信息。This sounds like a typical floating point problem, but hidden inside. While 0.025 may be represented exactly, the function
to_r
will no doubt perform various floating-point operations internally which are necessarily inexact. The result3602879701896397/144115188075855872
will no doubt match the intermediate, transformed version ofa
more closely than your proposal1/40
.Now
3602879701896397/144115188075855872
is extremely close to being the same as1/40
. But it is not quite equal, so is not simplified.For more information, look at some of the previous questions related to inexact floating point. This is a nuanced case and a good question therefore, but has its fundamentals in the same things. I'm looking into the ruby
C
implementation ofFloat#to_r
for more details.