我们该如何正确实现一个 i64 和 f64 数值的比较

2023-02-03 15:24:37 +08:00
 takato
比如以下



使用以下实现会得到错误结果 true



如果有兴趣研究此问题可以仔细阅读原作者写的博客。( not me )
https://orlp.net/blog/ordering-numbers/
1475 次点击
所在节点    Rust
7 条回复
ecnelises
2023-02-04 00:21:45 +08:00
试试在 Rust 或者 JS 里看看 905325263262362321.0 < 905325263262362322.0 的结果
takato
2023-02-04 12:58:25 +08:00
@ecnelises 我发现 JS 认为他们相等。
takato
2023-02-04 13:05:56 +08:00
905325263262362321.0 < 905325263262362322.0
false
905325263262362321.0 > 905325263262362322.0
false
905325263262362321.0 == 905325263262362322.0
true
liuxu
2023-02-04 16:44:41 +08:00
float 自己都不敢和自己比

corhuan
2023-02-04 17:49:59 +08:00
```rust
/// x <= y
fn is_less_eq(x: i64, y: f64) -> bool {
const H: f64 = 9223372036854775808f64;

if !y.is_finite() {
return false;
} else if y >= H {
return true;
} else if y < -H {
return false;
} else {
let y = y.floor() as i64;
x <= y
}
}

fn main() {
println!("{}", is_less_eq(9007199254740993, 9007199254740992.0));
println!("{}", is_less_eq(1, 1.125f64));
println!("{}", is_less_eq(1, 0.125f64));
println!("{}", is_less_eq(1, f64::MIN_POSITIVE));
println!("{}", is_less_eq(-1, -0.125f64));
println!("{}", is_less_eq(-1, -1.125f64));
println!("{}", is_less_eq(-1, -1f64));
println!("{}", is_less_eq(i64::MIN, i64::MIN as f64));
println!("{}", is_less_eq(i64::MIN, -9223372036854777856f64));
}
```
corhuan
2023-02-04 17:54:45 +08:00
275761919
2023-03-15 15:44:12 +08:00
@liuxu c 也是这样。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/912915

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX