为什么x和y总是带浮点数?

时间:2009-10-01 16:50:46

标签: c floating-point

int main(void){
    float x =1;
    float y =2;
    while (x<y){
        x = x +1 ;
        y = y +1;
}
    printf("x is %d\n", x);
    printf("y is %d\n", y);
}

我希望x和y增加到我们用完的位数,但在这种情况下,似乎x和y总是0 ...

5 个答案:

答案 0 :(得分:16)

正如其他人所说,您应该使用%f格式来打印浮点数,而不是%d,这是整数。还有%e,用科学记数法打印浮点数而不是固定符号,还有%g,它以科学或固定的方式打印,以较短者为准。

它打印为0的原因是因为当作为参数传递给可变参数函数(即带有未指定数量的参数的函数)(例如printf())时,浮点参数会自动转换为双精度数。数字2和3(xy的值)的双重表示分别为0x4000000000000000和0x4008000000000000,由IEEE-754 Floating-Point Conversion calculator计算。

在little-endian机器上(例如任何基于x86的机器),%d修饰符从堆栈中抓取接下来的4个字节并将它们解释为整数。因此,当您传递浮点数2时,它将转换为双精度为0x4000000000000000,在little-endian中为00 00 00 00 00 00 00 40.前四个字节使整数为0,这就是打印出的内容。 / p>

请注意,如果您在一个语句中打印两个数字而不是两个,则会得到更令人惊讶的结果:

printf("x=%d y=%d\n", x, y);
// Output: x=0 y=1073741824

如果将警告级别设置得足够高,大多数编译器都会警告您这些类型的错误。使用GCC,您应该使用-Wformat选项(或-Wall,包括-Wformat)进行编译,当您尝试使用%d打印浮点数时,它会发出警告事故。

答案 1 :(得分:12)

%d是一个整数。

http://www.cplusplus.com/reference/clibrary/cstdio/printf/

使用%f表示浮点数:

printf("x is %f\n", x);
printf("y is %f\n", y);

答案 2 :(得分:3)

一件事:你不应该在printf中使用%d代表浮点数,而是使用%f,%e或%g代替

答案 3 :(得分:1)

  

我希望x和y增加到我们用完的位

不,相反,当精度不足时,循环将停止。我相信在某些时候,数字会足够大,1.0f的增量太小而无法表示,x将等于y。

当您修复输出格式时,我猜您会看到情况。

答案 4 :(得分:0)

%d表示整数,使用%f。

你将耗尽比特,但不完全像一个整数,你最终将溢出指数,这应该会导致异常,虽然你可能不会知道。如果那会导致纳米或无穷大,我会忘记。这使得少于获得互动。我想知道为什么while循环不会永远运行。