math - 如何乘/除/加/减不同类型的数字?

标签 math rust arithmetic-expressions

我正在研究 Rust 手册的第二版,并决定尝试制作经典的摄氏度到华氏度转换器:

fn c_to_f(c: f32) -> f32 {
    return ( c * ( 9/5 ) ) + 32;
}

cargo build 编译会产生编译时错误:

error[E0277]: the trait bound `f32: std::ops::Mul<{integer}>` is not satisfied
 --> src/main.rs:2:12
  |
2 |     return (c * (9 / 5)) + 32;
  |            ^^^^^^^^^^^^^ the trait `std::ops::Mul<{integer}>` is not implemented for `f32`
  |
  = note: no implementation for `f32 * {integer}`

作为新的 Rust 程序员,我的解释是我不能将 float 和 integer 类型相乘。我通过将所有常量设为 float 来解决这个问题:

fn c_to_f(c: f32) -> f32 {
    return ( c * ( 9.0/5.0 ) ) + 32.0;
}

这让我有所保留。来自 C/C++/Java/Python,令人惊讶的是你不能简单地对不同类型的数字执行算术运算。像我在这里所做的那样,将它们简单地转换为同一类型是否正确?

最佳答案

长话短说:as是在原始数字类型之间进行转换的最常用方法,但使用它需要思考。

fn c_to_f(c: f32) -> f32 {
    (c * (9 as f32 / 5 as f32)) + 32 as f32
}

但是在这个例子中,更合理的做法是只使用浮点文字开始:

fn c_to_f(c: f32) -> f32 {
    (c * (9. / 5.)) + 32.
}

真正的问题是进行混合类型运算有点复杂。

如果您将1 乘以T通过 T ,您通常希望获得 T 类型的结果,至少是基本类型。

然而,当混合类型时,有一些困难:

  • 混合签名,
  • 混合精度。

那么,例如,i8 * u32 的理想结果是什么? ?可以包含所有i8的全套的最小类型和 u32值是 i64 .应该是这样的结果吗?

再举个例子,f32 * i32的理想结果是什么? ?可以包含所有f32的全套的最小类型和 i32值是 f64 .应该是这样的结果吗?

我发现拥有这样一个加宽的想法相当困惑。它还会影响性能(矢量化后,对 f32 的操作可能比对 f64 的操作快得多)。

由于这些问题,Rust 现在要求您明确说明:您希望在哪种类型中进行计算?哪种类型适合您的特定情况?

然后使用 as 进行适当的转换, 并考虑应用哪种舍入模式(从 float 到整数时, .round().ceil().floor().trunc())。

1 以类似的方式加、减和划分工作

关于math - 如何乘/除/加/减不同类型的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44552219/

相关文章:

javascript - JavaScript音频分析语音

寻找公共(public)乘数以将小数转换为整数的算法

c++ - 我无法在代码中找到最大的素数错误?

rust - 为什么 Rust 在引用可变变量时重新声明可变性?

rust - 是否可以用稳定的 rustc 运行夜间 cargo

algorithm - 如何计算将字符串转换为回文所需的字符数?

rust - 如何记录来自 Rust 编译器插件的宏?

bash - 超出表达式递归级别

java - Java算术表达式程序的类和构造函数设计