gpt4 book ai didi

floating-point - 为什么编译器解析源文件中的 float 与运行时不同?

转载 作者:行者123 更新时间:2023-11-29 08:04:14 25 4
gpt4 key购买 nike

我最近一直在从事一些 Rust 项目,以学习这门语言并获得一些乐趣。我正在写类似于 libconfig 的东西在 Rust 中,使用 peg crate 来生成我的解析器。

在过去的一个小时里,我一直在与一个奇怪的错误作斗争,在这个错误中,从示例配置文件中解析的某些值与预期值不相等。

最终,我将错误缩小为:

fn main() {
let my_flt = "10.4e-5".parse::<f32>().unwrap();
let other_flt = 10.4e-5;
println!("{} == {} -> {}", my_flt, other_flt, my_flt == other_flt);
}

令人惊讶的是,这会打印出:

0.000104 == 0.000104 -> false

See it in the playground

现在,我知道这必须与臭名昭著的旧浮点精度问题有关。我知道即使两个 float 在打印时看起来可能相同,但由于各种原因它们可以进行不同的比较,但我猜想从 parse::<f32>("X") 得到一个 float 相当于显式声明一个 float 并将其初始化为 X .显然,我错了,但为什么呢?

毕竟,如果我将一个 float 声明并初始化为 X , 在内部,编译器必须做与 parse() 相同的工作在生成最终可执行文件时。

为什么编译器解析 float X以不同于运行时的方式在源文件中 parse::<f32>()功能?这不应该是一致的吗?我很难结束这一切!

最佳答案

请注意,OP 的特定示例不再失败(在 Rust 1.31.0 中测试)


这是一个known issue标准库和 rustc 词法分析器以不同方式解析浮点值。

标准库最终调用到from_str_radix ,你可以在那里看到实现。我不确定解析浮点字面量的编译器版本究竟发生在何处,但是this comment表明它利用了 LLVM:

The compiler uses LLVM to parse literals and we can’t quite depend on LLVM for our standard library.

关于floating-point - 为什么编译器解析源文件中的 float 与运行时不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29291500/

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