2

Rust 显然是一门新语言(0.8)。它看起来很有趣,我开始研究它。我偶然发现了一些软件float被更改为f64,所以我想找到数据类型的定义,包括在哪里float定义的。我找不到任何非常具体的东西。我确实发现:

共有三种浮点类型:floatf32f64。浮点数写成0.01e62.1e-4。与整数一样,浮点文字被推断为正确的类型。后缀f,f32f64.

我猜“ float ”或“ f ”是 16 位的。

更笼统地说(我不是计算机科学家),是否真的值得摆弄所有这些小数据类型,如int, int32, int64, f, f32, f64(仅举几例)。我可以理解一些语言,例如。字节类型,因为字符串是一种相当复杂的类型。对于数字类型,我认为它只会造成不必要的复杂性。为什么不只是拥有i64andf64并称它们为intfloat(或i64andf64以适应未来的变化,或者将 float 和 int 默认设置为这些)。

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

4

2 回答 2

8

float, f32 and f64 are defined in the Rust manual: http://static.rust-lang.org/doc/0.8/rust.html#primitive-types

Specifically, for 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.

So float is not 16-bits, it's an alias for either f32 or f64, depending on the hardware.

To answer the second part of your question, in a low-language level like Rust, one can not simply postulate that a float is 64-bits, because if the hardware does not support this kind of floats natively then there is a significant performance penalty. One can neither have a single float type with an unspecified representation, because for a lot of use cases one need to have guarantees on the precision of the manipulated numbers.

In general, you would use float in the general case, and f32 or f64 when you have specific needs.

Edit: float has now been removed from the language, and there are only f32 and f64 float types now. The point being that all current architectures support 64-bits floats now, so float was always f64, and no use case were found for a machine-specific type.

于 2013-10-17T02:45:45.243 回答
6

对您的“更一般的注释”的回答:Rust 出于两个相互关联的原因公开了多种数字类型:

  • Rust 是一种系统语言。

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

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

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

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

一些忠告:

如果您不关心性能,只需使用最大的 inti64u64,或 float 类型,f64。生成的代码将具有易于预测的环绕和精确行为,但它在不同架构上的执行方式不同,并且在某些情况下会浪费空间或时间。

传统的 C 智慧形成鲜明对比(也许 Rust 社区会不同意我的观点),因为如果您使用“架构的自然类型”,相同的代码将在多个架构上运行良好。然而,我认为,环绕或浮点精度的意外差异是比性能更糟糕的问题。(我的偏见来自于处理安全问题。)

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

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

于 2013-10-19T19:44:36.927 回答