在C中,当±0.0支持-0.0或+0.0分配给a时double通常不会产生算术差异.尽管它们具有不同的位模式,但它们在算术上比较相同.
double zp = +0.0;
double zn = -0.0;
printf("0 == memcmp %d\n", 0 == memcmp(&zn, &zp, sizeof zp));// --> 0 == memcmp 0
printf("== %d\n", zn == zp); // --> == 1
Run Code Online (Sandbox Code Playgroud)
受到@Pascal Cuoq评论的启发,我正在寻找标准C中的一些功能,这些功能提供了算术上不同的结果.
注意:许多功能,如sin(),返回+0.0从f(+0.0)和-0.0从f(-0.0).但这些并不能提供不同的算术结果.这两个结果也不应该同时存在NaN.
在我的代码中,
float f = -0.0; // Negative
Run Code Online (Sandbox Code Playgroud)
并与负零相比
f == -0.0f
Run Code Online (Sandbox Code Playgroud)
结果将是true.
但
float f = 0.0; // Positive
Run Code Online (Sandbox Code Playgroud)
并与负零相比
f == -0.0f
Run Code Online (Sandbox Code Playgroud)
另外,结果将是true代替false
为什么在这两种情况下都是真的?
#include <iostream>
int main()
{
float f = -0.0;
std::cout<<"==== > " << f <<std::endl<<std::endl;
if(f == -0.0f)
{
std::cout<<"true"<<std::endl;
}
else
{
std::cout<<"false"<<std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
==== > -0 // Here print negative zero
true
Run Code Online (Sandbox Code Playgroud)