【发布时间】:2018-10-25 22:24:38
【问题描述】:
Rust 中如何处理浮点运算?
fn main() {
let vector = vec![1.01_f64, 1.02, 1.03, 1.01, 1.05];
let difference: Vec<f64> = vector.windows(2).map(|slice| slice[0] - slice[1]).collect();
println!("{:?}", difference);
}
返回:
[-0.010000000000000009, -0.010000000000000009, 0.020000000000000018, -0.040000000000000036]
预期输出:
[-0.01, -0.01, 0.02, -0.04]
我了解发生这种情况的原因,但从未解决它。
更新:
发表这篇文章是因为 Python 等其他语言的结果似乎是准确的。该计划是在 Rust 中复制 Python 的方法,但经过进一步调查,Python、numpy 和 pandas 都以相同的方式处理数字。也就是说,不准确性仍然存在,但并不总是可见/显示。另一方面,Rust 使这些不准确之处显而易见,起初令人困惑。
例子:
l = [1.01, 1.02, 1.03, 1.01, 1.05]
for i in l:
print('%.18f' % i)
打印:
1.010000000000000009
1.020000000000000018
1.030000000000000027
1.010000000000000009
1.050000000000000044
而print(l) 打印:
[1.01, 1.02, 1.03, 1.01, 1.05]
【问题讨论】:
-
我相信您可以将数字四舍五入到最接近的 1/10,000,应该没问题。
-
有literal books written on the topic of "handling" floating point math。这个问题远太宽泛了,无法以有用的方式回答,尤其是当你甚至不知道你想解决它的方向时。也请查看What Every Programmer Should Know About Floating-Point Arithmetic。
-
要么不使用浮点数(因为你知道为什么会发生这种情况,所以我不会深入探讨),或者将答案四舍五入到你需要的精度。这通常就足够了。
-
@patrick 有没有办法在运行时识别输入的精度?这篇文章看起来是一个很好的解决方案,我只需要了解在运行时将 10 提升到什么功率:stackoverflow.com/questions/28655362/…
标签: floating-point rust precision floating-accuracy