Rust是否定义了将非有限浮点数转换为整数时会发生什么?

4

我认为传统上,所有退化的浮点数都被称为“NaN”,但Rust似乎区分三种类型的退化浮点数:+inf、-inf和nan(这就是为什么我在标题中使用“非有限”而不是“nan”或“无穷大”的原因)。

当你尝试将它们转换为整数,比如u64时,会发生什么?是否有定义行为?如果有,那么定义行为是什么?

我认为这是未定义的。7年前reddit上的一个帖子说它是未定义的,但事情可能已经改变了。

在“Rust示例”中,似乎说nan会被转换为0。

根据我的实验,它在实践中不会崩溃,因此除非编译器存在明显的错误,否则我认为行为不被定义为“panics”。


嗯,看起来它在内部使用了 float_to_int_unchecked,该函数在内部使用了 llvm 的 fptoui。所以它肯定不会出现 panic,但我不知道它还做了什么。顺便问一下,为什么不链接那个七年前的 Reddit 帖子呢? - Caesar
1个回答

7

这在 Rust 参考文档这里有定义:

数值类型转换

从浮点数到整数的转换将向零舍入浮点数

  • NaN 将返回 0

  • 大于最大整数值的数值,包括 INFINITY,会饱和到整数类型的最大值。

  • 小于最小整数值的数值,包括 NEG_INFINITY,将饱和到整数类型的最小值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接