Math 如何乘/除/加/减不同类型的数字?
我正在阅读生锈手册的第二版,并决定尝试制作经典的摄氏到华氏转换器:Math 如何乘/除/加/减不同类型的数字?,math,rust,arithmetic-expressions,Math,Rust,Arithmetic Expressions,我正在阅读生锈手册的第二版,并决定尝试制作经典的摄氏到华氏转换器: fn c_to_f(c: f32) -> f32 { return ( c * ( 9/5 ) ) + 32; } 使用货物构建编译此文件将产生编译时错误: error[E0277]:未满足特性绑定'f32:std::ops::Mul' -->src/main.rs:2:12 | 2 |返回(c*(9/5))+32; |^^^^^^^^^^^^^^^^^特性“std::ops::Mul”未为“f32”实现` |
fn c_to_f(c: f32) -> f32 {
return ( c * ( 9/5 ) ) + 32;
}
使用货物构建编译此文件将产生编译时错误:
error[E0277]:未满足特性绑定'f32:std::ops::Mul'
-->src/main.rs:2:12
|
2 |返回(c*(9/5))+32;
|^^^^^^^^^^^^^^^^^特性“std::ops::Mul”未为“f32”实现`
|
=注意:`f32*{integer}没有实现`
作为一个新的Rust程序员,我的解释是我不能将浮点和整数类型相乘。我通过将所有常量设为浮点来解决这个问题:
fn c_to_f(c: f32) -> f32 {
return ( c * ( 9.0/5.0 ) ) + 32.0;
}
这使我有所保留。来自C/C++/Java/Python,令人惊讶的是,您不能简单地对不同类型的数字执行算术运算。像我在这里做的那样,简单地将它们转换为相同的类型是正确的吗?TL;DR: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.
}
真正的问题是做混合型算术有点复杂
如果将aT
乘以aT
,通常希望得到类型为T
,至少是基本类型的结果
但是,混合类型时,存在一些困难:
- 混合信号
- 混合精度
那么,例如,i8*u32
的理想结果是什么?可以包含全部i8
和u32
值的最小类型是i64
。这应该是结果吗
另一个例子是,f32*i32
的理想结果是什么?可以包含所有f32
和i32
值的完整集合的最小类型是af64
。这应该是结果吗
我觉得拥有这样一个广阔的世界的想法相当令人困惑。它还对性能有影响(一旦矢量化,f32
上的操作可能比f64
上的操作快得多)
由于这些问题,Rust现在要求您明确:您希望将计算带入哪种类型?哪种类型适合您的特殊情况
然后使用as
进行适当的强制转换,并考虑应用哪种舍入模式(.round()
,.ceil()
,.floor()
或.trunc()
从浮点转换为整数)
1以类似的方式加、减、除运算。顺便说一句,(c*(9/5))+32的可能重复,可以解释如何施放吗?“如果我想在将来乘/除/加/减不同类型的数字,解决方案是什么?”@Stargateur:这一点很好,对我来说似乎很明显,但最好说清楚,特别是从FP到整数的转换需要选择适当的舍入模式。具体的例子请,例如,如果我想将f64划分为u128,那么在不首先将u128强制转换为f64的情况下(因为它们会溢出),如何才能做到这一点?。