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

Where are data-types for Rust (eg. float) defined?

rust显然是一种新语言(0.8)。它看起来很有趣,我开始研究它。我提到了一些将float更改为f64的软件,因此我想查找定义了包括float在内的数据类型的位置。我找不到非常具体的东西。我确实找到了:

There are three floating-point types: float, f32, and f64. Floating-point numbers are written 0.0, 1e6, or 2.1e-4. Like integers, floating-point literals are inferred to the correct type. Suffixes f, f32, and f64.

我猜" float"或" f"是16位。

总的来说(我不是计算机科学家),真的值得弄乱所有这些小数据类型,例如intint32int64ff32f64(仅举几例)。我可以理解一些语言,例如。字节类型,因为字符串是一个相当复杂的类型。对于数字类型,我认为这只会造成不必要的复杂性。为什么不只具有i64f64并将它们称为int和float(或i64f64以满足将来的更改,或者将float和int默认设置为这些)。

也许有些低级程序需要较小的值,但是为什么不将使用量保留给需要它们的程序却又将其置于核心之外?我发现从(例如)转换成它是不必要的琐事。 inti64等,它真正实现了什么?或者,将它们保留在"核心"中,但默认为64位类型。 64位类型显然是必需的,而其余的仅对于特定情况(IMO)是必需的。


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

特别是对于float

The Rust type float is a machine-specific type equal to one of the
supported Rust floating-point machine types (f32 or f64). It is the
largest floating-point type that is directly supported by hardware on
the target machine, or if the target machine has no floating-point
hardware support, the largest floating-point type supported by the
software floating-point library used to support the other
floating-point machine types.

所以float不是16位的,它是f32f64的别名,具体取决于硬件。

要回答问题的第二部分,在像Rust这样的低语言级别中,我们不能简单地假设浮点数是64位,因为如果硬件本身不支持这种浮点数,则存在一个明显的性能损失。一个人都不能具有未指定表示形式的单一浮点类型,因为在很多用例中,都需要保证被操纵数字的精度。

通常,通常使用float,有特殊需要时使用f32f64

编辑:float现在已从语言中删除,并且现在只有f32f64浮点类型。关键是所有当前体系结构现在都支持64位浮点型,因此float始终为f64,并且未发现特定于计算机的类型的用例。


"更一般的注释"的答案:Rust出于两个相互关联的原因而公开了这种数字类型:

  • Rust是一种系统语言。

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

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

    C可能出于相同的理由做出了相同的区分,或者可能做出了区分,因为C在提供较少的抽象并将更多的委托给基础汇编程序时更为简单。

    无论哪种方式,为了在Rust和C之间互操作而不使用昂贵的通用抽象层,每种语言中的原始类型都直接相互对应。

一些建议:

如果您不关心性能,只需使用最大的整数i64u64或浮点型f64。生成的代码将具有易于预测的环绕效果和精度行为,但是在不同的体系结构上将具有不同的性能,并且在某些情况下会浪费空间或时间。

这与传统的C语言智慧相反(也许Rust社区会不同意我的看法),因为如果您将"自然类型用于架构",则相同的代码将在多种架构上运行良好。但我认为,环绕精度或浮点精度的意外差异是比性能更糟糕的问题。 (我的偏见来自于处理安全性。)

如果要避免完全用整数环绕,可以使用bigints,这是对硬件基元的昂贵的软件抽象。

顺便说一句,我很欣赏明确地将f64作为提醒我精确度错误的类型。例如,JavaScript数字为f64,但是可能很容易忘记这一点,并会对诸如var f = Math.pow(2, 53); f + 1 === f的JS代码(其值为true)感到惊讶。在Rust中也是如此,但是由于我注意到类型是f64,所以我更容易记住。