Rust(例如float)的数据类型在哪里定义?

Bri*_* Oh 2 rust

Rust显然是一种新语言(0.8).它看起来很有趣,我开始关注它.我提到了一些软件float被改为f64,所以我想找到数据类型的位置,包括float定义的.我找不到任何非常具体的东西.我找到了:

有三个浮点类型:float,f32,和f64.浮点数写入0.0,1e62.1e-4.与整数一样,浮点文字也被推断为正确的类型.后缀f,f32f64.

我猜" 浮动 "或" f "是16位.

在更广泛的说明(我不是计算机科学家),是不是真的值得所有这些小的数据类型,如瞎搞int,int32,int64,f,f32,f64(仅举几例).我可以理解一些语言,例如.字节类型,因为字符串是一个相当复杂的类型.对于数字类型,我认为它只会产生不必要的复杂性.为什么不有i64f64,并呼吁他们诠释漂浮(或i64f64,以应付未来的变化,或者有浮动和INT默认这些).

也许有一些低级程序需要较小的值,但为什么不保留那些需要它们的程序使用并将它们排除在核心之外呢?我发现从例如转换是不必要的苦差事.inti64等,它有什么真正实现?或者,将它们保留在"核心"中,但默认为64位类型.64位类型显然是必要的,而其余只是特定情况(IMO)所必需的.

Cyr*_* Ka 8

float,f32f64在Rust手册中定义:http://static.rust-lang.org/doc/0.8/rust.html#primitive-types

具体来说,对于float:

Rust类型float是一种机器特定类型,等于受支持的Rust浮点机器类型之一(f32或f64).它是目标机器上硬件直接支持的最大浮点类型,或者如果目标机器没有浮点硬件支持,则软件浮点库支持的最大浮点类型用于支持其他浮点机器类型.

所以float不是16位,它是f32或者的别名f64,取决于硬件.

要回答你的问题的第二部分,在像Rust这样的低语言级别,人们不能简单地假设一个浮点数为64位,因为如果硬件本身不支持这种浮点数那么就会有明显的性能损失.一个人既不能有一个带有未指定表示的浮点类型,因为对于很多用例,需要保证被操纵数字的精度.

通常,您会float在一般情况下使用,f32或者f64在您有特定需求时使用.

编辑: float现在已从语言中删除,现在只有f32f64浮动类型.关键是所有当前架构现在都支持64位浮点数,所以float总是这样f64,并且没有找到特定于机器类型的用例.


nej*_*omo 6

对"更一般的注释"的回答:Rust出于两个相互关联的原因暴露了这种数字类型:

  • Rust是一种系统语言.

    编译目标(LLVM,或最终具体的机器代码,例如amd64)使这些区别代表不同的硬件功能.为不同平台选择不同的数据类型会影响运行时性能,内存和其他资源使用.这种灵活性暴露给程序员,允许他们将软件微调到特定的硬件.

  • Rust优先考虑与C的互操作.

    C可能对相同的理由做出了相同的区分,或者它可能已经区分,因为当C提供更少的抽象并且更多地委托给底层汇编程序时,C更简单.

    无论哪种方式,为了在Rust和C之间进行互操作而它们之间没有昂贵的通用抽象层,每种语言中的基元类型直接相互对应.

一些忠告:

如果您不关心性能,只需使用最大的int,i64u64,或float类型f64.生成的代码将具有易于预测的环绕和精度行为,但它将在不同的体系结构上执行不同的操作,并且在某些情况下会浪费空间或时间.

This contrasts with the conventional C wisdom (and maybe the Rust community would disagree with me), because if you use the "natural type for the architecture" the same code will perform well on multiple architectures. I'm of the opinion, however, that unexpected differences in wrap-around or float precision are a worse problem than performance. (My bias comes from dealing with security.)

If you want to avoid wrap around completely with integers, you can use bigints, which are costly software abstractions over hardware primitives.

顺便说一句,我很欣赏f64这种类型提醒我精确错误.例如,JavaScript编号是f64,但可能很容易忘记这一点,并对JS代码var f = Math.pow(2, 53); f + 1 === f进行评估而感到惊讶true.在Rust中也是如此,但是因为我注意到类型是f64我更容易记住.