在我的代码中,
float f = -0.0; // Negative
并与 负零 比较
f == -0.0f
结果将是 true
。
但
float f = 0.0; // Positive
并与 负零 比较
f == -0.0f
此外,结果将是 true
而不是 false
为什么在这两种情况下结果都是正确的?
这是 一个 MCVE 来测试它(在 coliru 上直播) :
#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;
}
}
输出:
==== > -0 // Here print negative zero
true
原文由 Jayesh 发布,翻译遵循 CC BY-SA 4.0 许可协议
C++11 引入了诸如
std::signbit()
可以检测有符号零和std::copysign()
之类的函数,如果实现支持有符号零(例如由于使用IEEE 浮点数)。这些函数的规范实际上并不要求实现支持不同的正零和负零。除了那种事情,我不知道 C++ 标准中的任何引用甚至提到了带符号的零,更不用说比较它们的结果了。C++ 标准也没有规定任何浮点表示 - 这是实现定义的。
尽管不是确定的,但这些观察表明,对有符号零的支持或比较它们的结果将取决于实现支持的浮点表示。
IEEE-754 是现代实现(即其主机系统上的编译器)使用的常见(尽管不是唯一)浮点表示。当前(2008 年发布)版本的 IEEE-758“IEEE 浮点算术标准”第 5.11 节第二段说(粗体强调我的)