5

我只是想知道 C11 或 C99 在这方面提供了什么保证(如果有的话)。

根据经验,似乎当我将浮点值(无论其精度如何)转换为有符号整数时,只要浮点值在该有符号整数范围内不可表示,即使在事件中,我也会得到“很好”的饱和度浮点值是正负无穷大(但我不知道也不关心 NaN 的情况)。

这里有一个微妙的问题,即舍入行为的差异在某些情况下可能会导致饱和,但在其他情况下不会,特别是当我们正好处于饱和边界的边缘时。我对此并不担心。我的问题是,一旦浮点机器决定了它需要输出的整数(取决于平台),但如果所述整数位于目标有符号整数范围之外(与平台无关) ),无论饱和度是否由规范保证。

我的默认理解是,我所看到的只是底层硬件的便利,并且由于未定义有符号溢出,因此无法保证这种行为。我希望我错了,因为我讨厌签名溢出并试图避免它。所以是的,我也对转换为无符号整数的情况感兴趣。

当我在它的时候,负0呢?这个值是否保证转换为整数零,即使在某种意义上您可以将其视为负 epsilon,通常会四舍五入为 -1?

4

3 回答 3

10

6.3.1.4 实数浮点数和整数

当实浮点类型的有限值转换为_Bool 以外的整数类型时,小数部分被丢弃(即,该值被截断为零)。如果整数部分的值不能用整数类型表示,则行为未定义。)

于 2013-01-22T13:37:23.413 回答
3

phresnel已经很好地回答了您问题的主要内容。要记住的其他一些细节:

所以是的,我也对转换为无符号整数的情况感兴趣。

unsigned 的情况也好不到哪里去。C11 中的脚注 61(C99 中存在相同的脚注):

将整数类型的值转换为无符号类型时执行的求余运算不需要在将实浮点类型的值转换为无符号类型时执行。因此,可移植实浮点值的范围是(-1,Utype_MAX+1)

幸运的是,这对于有符号和无符号转换都很容易解决;如果您需要饱和度,只需在转换之前钳制您的输入。

当我在它的时候,负0呢?这个值是否保证转换为整数零,即使在某种意义上您可以将其视为负 epsilon,通常会四舍五入为 -1?

是的,它保证转换为整数零。首先, 的值-0恰好为零,而不是负 epsilon(与您在互联网上阅读的谣言相反)。其次,从浮点到整数的转换会截断该值,因此即使该值是“负 epsilon”(无论这意味着什么),结果也会为零,因为“负 epsilon”位于区间 (-1, 1) 中。

于 2013-01-23T00:53:41.853 回答
1

当我在它的时候,负0呢?这个值是否保证转换为整数零,即使在某种意义上您可以将其视为负 epsilon,通常会四舍五入为 -1?

它被截断,因此趋向于零 - 意味着小于 1.0 和大于 -1.0 的任何值都变为 0。就“典型”平台而言,负零变为零。我不完全确定标准是否能保证这一点,但我相信在实践中你可以依赖它,即使标准没有定义它[除非你计划让你的代码在极其“奇怪”的设备上运行,例如 DSP 或 GPU]。

于 2013-01-22T13:47:57.950 回答