int to float cast 如何对大量数字起作用?

hko*_*hko 0 c floating-point casting

如果我们将整数转换为浮点数,当它变得太大而无法用浮点数精确表示时,需要四舍五入或截断它。这是一个小测试程序来看看这个四舍五入。

#include <stdio.h>

#define INT2FLOAT(num) printf(" %d: %.0f\n", (num), (float)(num));

int main(void)
{
    INT2FLOAT((1<<24) + 1);
    INT2FLOAT((1<<24) + 2);
    INT2FLOAT((1<<24) + 3);
    INT2FLOAT((1<<24) + 4);
    INT2FLOAT((1<<24) + 5);
    INT2FLOAT((1<<24) + 6);
    INT2FLOAT((1<<24) + 7);
    INT2FLOAT((1<<24) + 8);
    INT2FLOAT((1<<24) + 9);
    INT2FLOAT((1<<24) + 10);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

 16777217: 16777216
 16777218: 16777218
 16777219: 16777220
 16777220: 16777220
 16777221: 16777220
 16777222: 16777222
 16777223: 16777224
 16777224: 16777224
 16777225: 16777224
 16777226: 16777226
Run Code Online (Sandbox Code Playgroud)

两个可表示整数中间的值有时会向上舍入,有时会向下舍入。似乎应用了某种舍入到偶数。这是如何工作的?我在哪里可以找到进行这种转换的代码?

M.M*_*M.M 5

这种隐式转换的行为是实现定义的:(C11 6.3.1.4/2):

如果要转换的值在可以表示但不能精确表示的值范围内,则结果是最接近的较高或最接近的较低可表示值,以实现定义的方式选择。

这意味着您的编译器应该记录它是如何工作的,但您可能无法控制它。

在将浮点源舍入为 integer 时,有各种函数和宏可用于控制舍入方向,但我不知道将 integer 转换为 float 的情况。

  • @hko 不知道,但很可能它是由您的硬件处理的,而不是在 gcc 中显式发生 (2认同)