V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
takato
V2EX  ›  Rust

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

  •  
  •   takato · 2023-02-03 15:24:37 +08:00 · 1194 次点击
    这是一个创建于 419 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如以下



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



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

    corhuan
        5
    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));
    }
    ```
    275761919
        7
    275761919  
       2023-03-15 15:44:12 +08:00
    @liuxu c 也是这样。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5193 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:41 · PVG 17:41 · LAX 02:41 · JFK 05:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.