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

Posted

技术标签:

【中文标题】如何乘/除/加/减不同类型的数字?【英文标题】:How to multiply/divide/add/subtract numbers of different types? 【发布时间】:2017-11-17 01:05:25 【问题描述】:

我正在阅读 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 程序员,我的解释是我不能将浮点和整数类型相乘。我通过使所有常量浮点数解决了这个问题:

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

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

【问题讨论】:

Subtraction not implemented for f32?的可能重复 顺便说一句,( c * ( 9/5 ) ) + 32 => c * (9 / 5) + 32 => c * 0 + 32 => 32 【参考方案1】:

TL;DRas 是在原始数字类型之间进行转换的最常用方法,但使用它需要思考。

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.


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

如果您将TT 相乘1,您通常希望得到T 类型的结果,至少是基本类型。

但是,在混合类型时,存在一些困难:

混合符号, 混合精度。

那么,例如,i8 * u32 的理想结果是什么?可以包含所有i8u32 值的完整集的最小类型是i64。应该是这样的结果吗?

再举个例子,f32 * i32 的理想结果是什么?可以包含所有f32i32 值的完整集的最小类型是f64。应该是这样的结果吗?

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

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

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

1加法、减法和除法的工作方式相似

【讨论】:

也许解释一下如何投? “如果我以后想乘/除/加/减不同类型的数字,有什么解决方案?”。 @Stargateur:好点,这对我来说似乎很明显,但最好把它说清楚,特别是从 FP 转换为积分需要选择适当的舍入模式。 请举个具体例子 所以,如果我想得到一个 f64 从除法到 u128 的例子,如果不将 u128 转换为 f64 的第一个(因为它们会溢出),你怎么能做到这一点?。

以上是关于如何乘/除/加/减不同类型的数字?的主要内容,如果未能解决你的问题,请参考以下文章

php数学函数,加(bcadd)减(bcsub)乘(bcmul)除(bcdiv)

从终端输入两个数,完成加,减,乘,除

加/减/乘/除 下的取余

加/减/乘/除四则混合运算(C 语言)

基本数据类型

用C语言编写一个计算器程序,实现加,减,乘,除,求平方根(正数),倒数等功能.