gpt4 book ai didi

rust - 检查一个数字是否可以精确表示为 `f32`

转载 作者:行者123 更新时间:2023-11-29 07:48:30 27 4
gpt4 key购买 nike

我想知道值 1/256、2/256、3/256、... 254/256 和 255/256 是否可以精确表示为 f32。现在,聪明的人会考虑 float 的工作原理并找出答案。但我想在程序中检查一下。我要检查的所有数字都是分数,我控制这些值(即没有用户输入)。

我从这个开始:

for n in 1u8..=255 {
let f = (n as f32) / 256.0;
println!("{}", f);
}

但是现在呢?我尝试打印数字以查看是否有大量重复出现的数字,但这并不总是有效。例如,不能精确表示的 0.4:

println!("{}", 0.4);     // prints "0.4"
println!("{:.20}", 0.4); // prints "0.40000000000000002220"

在这里,我们必须手动提高精度才能看到问题。在任何情况下,查看字符串输出似乎都不是最佳解决方案。

首先我认为 f32 上可能有一个方法,但这没有多大意义,不是吗?因为当 f32 已经存在时,没有办法知道它的值是否有意为之。所以我们必须在创建浮点值时以某种方式找出并与“理想化”值进行比较?

有什么方法可以检查一个值是否可以精确表示为 f32

最佳答案

类型 Rational 来自 rug crate可以精确地表示分数。它还实现了 PartialEq<f32>所以你可以将确切的表示与你的 f32 进行比较直接检查它们是否相等。

for n in 1u8..=255u8 {
let rat = Rational::from((n, 256));
let f = (n as f32) / 256.0;
println!("{}/256 -> {}", n, rat == f);
}

正如您从输出中看到的那样,您要测试的数字确实可以精确表示为 f32 .

要获得更多更有趣的输出,请尝试 1 / n :

for n in 1u8..=255u8 {
let rat = Rational::from((1, n));
let f = 1.0 / (n as f32);
println!("1/{} -> {}", n, rat == f);
}

这表明只有分母为 2 的幂的分数才能精确表示。

关于rust - 检查一个数字是否可以精确表示为 `f32`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54782405/

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