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

时间:2013-10-17 00:51:10

标签: rust

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

  

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

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

更一般地说(我不是计算机科学家),是否真的值得搞乱所有这些小数据类型,如intint32int64,{ {1}},ff32(仅举几例)。我可以理解一些语言,例如。字节类型,因为字符串是一个相当复杂的类型。对于数字类型,我认为它只会产生不必要的复杂性。为什么不只是f64i64并将它们称为 int float (或f64i64来迎合对于将来的更改,或者将float和int默认为这些)。

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

2 个答案:

答案 0 :(得分:8)

Rust手册中定义了

floatf32f64http://static.rust-lang.org/doc/0.8/rust.html#primitive-types

具体来说,对于float

  

Rust类型float是一个特定于机器的类型,等于其中一个   支持Rust浮点机类型(f32或f64)。它是   硬件直接支持的最大浮点类型   目标计算机,或者目标计算机没有浮点数   硬件支持,支持的最大浮点类型   用于支持另一个的软件浮点库   浮点机类型。

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

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

一般情况下,您会在一般情况下使用float,在有特殊需求时使用f32f64

修改 float现已removed from the language,现在只有f32f64个浮动类型。关键是所有当前架构现在都支持64位浮点数,因此float总是f64,并且没有找到特定于机器类型的用例。

答案 1 :(得分:6)

对您的“更一般性说明”的回答:Rust出于两个相互关联的原因暴露了这种数字类型:

  • Rust是一种系统语言。

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

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

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

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

一些建议:

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

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

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

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