rust - rust 的直接乘法和递归之间有什么区别

标签 rust

我是 rust 病新手,正在尝试解决this leetcode问题,我写了以下代码段

fn main() {
    println!("{}", Solution::my_pow(0.00001, 2147483647))
}

struct Solution {}

impl Solution {
    pub fn my_pow(x: f64, n: i32) -> f64 {
        let mut base = x;
        let mut exp = n;
        let mut res = 1.0;
        if n < 0 {
            base = 1.0 / base;
            exp = -n;
        }
        let mut i = 1;
        while exp != 0 {
            let mut temp = base;
            while i * 2 <= exp {
                temp *= temp;
                i *= 2;
            }
            res *= temp;
            exp -= i;
            i = 1;
        }
        res
    }
}
当我运行代码时,它 panic 并打印一条错误消息,说thread 'main' panicked at 'attempt to multiply with overflow', src/main.rs:19:19,但以下代码段
impl Solution {
    pub fn my_pow(x: f64, n: i32) -> f64 {
        fn pow(x: f64, res: f64, n: i64) -> f64 {
            match n {
                0 => res,
                n if n & 1 == 1 => pow(x*x, res*x, n>>1),
                _ => pow(x*x, res, n>>1)
            }
        }
        match n {
            0 => 1.0,
            n if n < 0 => pow(1.0/x, 1.0, (n as i64).abs()),
            _ => pow(x, 1.0, n as i64)
        }
    }
}
可以按预期运行。我很迷惑。这两个代码段之间有什么区别?

最佳答案

What is the difference between the two code snippets?


其中一个溢出,而另一个不溢出。您是否考虑过阅读错误消息,并想知道这与您的代码有什么关系? panic 指向:
while i * 2 <= exp {
您没有指定i的类型就定义了它,这意味着它是i32(32b有符号整数,二进制补码)。您一直将其乘以2,因此除了其初始值之外,它只能是偶数,并且一直这样做,直到它大于exp为止,后者最初是n,也就是2147483647
大于2147483647的偶数是2147483648,它不是有效的i32,因此会溢出。 panic 告诉你的是什么。

关于rust - rust 的直接乘法和递归之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65872046/

相关文章:

rust - 如何在WASM-Bindgen和Rust中实际获取响应正文的文本

rust - 从 Axum IntoResponse 访问请求 header

rust - 如何在结构中存储递归引用

rust - 存储任何 JoinHandle<> 变体

rust - 构建底物期间的编译问题

rust - 如何迭代 itertools::chunks

javascript - 如何将一些wasm文件用于不依赖wasm-pack的其他JavaScript项目?

serialization - 将字符串或枚举放入 LMDB

rust - 如何将编译期间命令行上提供的字符串编译成我的 Rust 二进制文件?

struct - 如何将特征泛型类型链接到已实现类型中的其他元素