gpt4 book ai didi

ruby - r 的最大倍数不大于 x

转载 作者:数据小太阳 更新时间:2023-10-29 08:46:52 25 4
gpt4 key购买 nike

给定 float xr,获得 r 的最大倍数不大于 x< 的最佳方法是什么?

编辑

给定 float xr,获得 r 的最小倍数不小于 x< 的最佳方法是什么?


编辑想到的两种方式如下:

x.div(r).*(r)
x-(x.modulo(r))

3.7.div(0.5).*(0.5) #=> 3.5
3.7-(3.7.modulo(0.5)) #=> 3.5

基准测试结果是:

require "benchmark/ips"
Benchmark.ips do |b|
b.report{3.7.div(0.5).*(0.5)}
b.report{3.7-(3.7.modulo(0.5))}
end

Calculating -------------------------------------
70669 i/100ms
94162 i/100ms
-------------------------------------------------
1951384.0 (±1.3%) i/s - 9822991 in 5.034777s
3713013.7 (±1.9%) i/s - 18644076 in 5.023100s

如果有人能解释两者之间的准确性是否存在差异,以及为什么第二个更快,那也很好。

欢迎更准确/更快的回答。

最佳答案

来自不了解 Ruby 的人,关于您问题的准确性部分的答案:

模浮点运算始终是精确的。因此,如果您使用数学计算,3.7.modulo(0.5) 正是您所期望的(假设您了解 3.7 不是 37/10,而是最接近的浮点值到那个)。因此 3.7-(3.7.modulo(0.5)) 是最接近精确结果的浮点值,您希望用浮点值表示的最佳结果。

你问题中的另一个选择,3.7.div(0.5).*(0.5),似乎使用了我将称之为“积分除法”的操作,.div ,在浮点值之间。这是一个很棒的原始人。 (不是所有的编程语言都有,第一次遇到。)

我不认为这个整数除法运算总是精确的,因为它的理想结果可能太大而不能精确地表示为 float 。但是,当结果小于 253 时,它是准确的(如果正确实现应该是准确的)。

X.div(Y).*(Y) 中的整数除法结果准确时,此操作序列也会计算出可能的最佳结果。乘法是唯一的舍入步骤。

当积分除法的结果不准确时,则有两次复合舍入步骤,一次用于积分除法,一次用于乘法,导致最终误差较大。但这只有在 X 大于 253Y 时才会发生。

为简单起见,所有值均假定为正值

关于ruby - r 的最大倍数不大于 x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25300932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com