使用浮点数和双精度时,c 中的 -0.0000 是啥?

Posted

技术标签:

【中文标题】使用浮点数和双精度时,c 中的 -0.0000 是啥?【英文标题】:what is -0.0000 in c when using floats and double?使用浮点数和双精度时,c 中的 -0.0000 是什么? 【发布时间】:2013-02-16 23:40:20 【问题描述】:
#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 值?

【问题讨论】:

en.wikipedia.org/wiki/Signed_zero 通过将a 的类型固定为double @joe:结果不是负零。只是打印的地方太少了。 谢谢!这只是一个推测性的***链接。我会把它留在那里作为其他人的教训。 注意:?: 是 GCC 扩展 【参考方案1】:

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

【讨论】:

以上是关于使用浮点数和双精度时,c 中的 -0.0000 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

浮点数中单精度和双精度的编码表示

与浮点数和双精度相关的概念

C语言中单精度和双精度浮点型数据的数值范围是多少?怎么算出来的?请大虾帮忙了!

MySQL 浮点数类型和定点数类型

空格分隔输出

将(n个第一个字节)无符号字符指针转换为浮点数和双精度C++