2
#include <stdio.h>
#include <stdlib.h>

#define answer 3.141593

void main(int argc, char **argv) {

        float a = (argc - 2)?: strtod(argv[1], 0);    
        printf("double = %lf ,float =  %f", a-answer , a-answer);

}

当我这样运行它时:

./a.out 3.141593

输出是

double = -0.000000 ,float =  -0.000000

为什么呢-0.00000?我怎样才能让它输出0.000000

我该怎么做a == answer


如果它使用 2 的补码,怎么会有 -0 值?

4

1 回答 1

7

浮点数不使用 2 的补码。它们有符号、指数和尾数,你的数字只有零和符号,或者更可能的是,你有一些像 -1.0e-15 这样的数字,打印为 -0.0000。尝试 %e 而不是 %f。微小的差异是由于无法以有限精度数据类型存储具有无限精度的数字(发生了一些舍入),并且当您将 double 更改为 float 时,必须进行额外的舍入。(请记住,3.141593 是二进制表示的无限周期数,这实际上取决于该数字存储在哪种类型中)

于 2013-03-02T14:01:32.657 回答