c中的双变量类型:(负)0不等于0

时间:2015-10-17 05:09:00

标签: c numbers double zero

为什么会有负0.000?

为什么它不等于0.000?

2 个答案:

答案 0 :(得分:2)

正负零的概念是IEEE 754浮点格式的一个特征。不要求C实现使用IEEE浮点格式,但在实践中,它是相当普遍的。

即使使用IEEE浮点格式的C实现,当使用数字比较(例如==运算符)时,正零和负零将始终比较相等。在此类实现中检测或使用正负零的唯一方法是使用copysign()signbit()等函数(在<math.h>中声明)。

答案 1 :(得分:0)

  

为什么会有负0.000?

这可能会有所帮助 What operations and functions on +0.0 and -0.0 give different arithmetic results?

  

为什么(负0.000)不等于0.000?

这是一个常见的错误结论。重新开始以下内容:

double a = 1e-10;
double b = -2e-20;
printf("a:%f b:%f\n", a, b);
printf("a==b? %d\n", a == b);
printf("a:%e b:%e\n", a, b);

double z = 0.0;
double nz = -0.0;
printf("n:%f nz:%f\n", z, nz);
printf("n==nz? %d\n", z == nz);

输出

a:0.000000 b:-0.000000   // a and b appear to be 0.0 and -0.0
a==b? 0                  // not same value
a:1.000000e-10 b:-2.000000e-20

n:0.000000 nz:-0.000000  // n and nz appear to be 0.0 and -0.0
n==nz? 1                 // same value