C++ 为什么这个双值打印为-0";? double a=0; 双b=-42; 双结果=a*b; 虽然-0.0和0.0的位表示法不同,但它们值相同,因此-0.0==0.0将返回真。在您的情况下,结果是-0.0,因为其中一个操作数是负数
请参阅此演示:C++ 为什么这个双值打印为-0";? double a=0; 双b=-42; 双结果=a*b; 虽然-0.0和0.0的位表示法不同,但它们值相同,因此-0.0==0.0将返回真。在您的情况下,结果是-0.0,因为其中一个操作数是负数,c++,C++,请参阅此演示: double a = 0; double b = -42; double result = a * b; cout << result; 正如您自己所见,-0.0的最后一个字节与0.0的最后一个字节不同 希望有帮助。我相信0==-0,所以没有问题-0是一个浮点问题。值得一读。我已编辑了标题以使其更具体。零值是有效位为0的有限值。这些是有符号的零,符号位指定零是+0(正零)还是零−0(负零)。“@Walter-浮点比较定义良好,非常有用。害怕他们的程序员因为他们不理解
double a = 0;
double b = -42;
double result = a * b;
cout << result;
正如您自己所见,-0.0
的最后一个字节与0.0
的最后一个字节不同
希望有帮助。我相信0==-0,所以没有问题-0是一个浮点问题。值得一读。我已编辑了标题以使其更具体。零值是有效位为0的有限值。这些是有符号的零,符号位指定零是+0(正零)还是零−0(负零)。“@Walter-浮点比较定义良好,非常有用。害怕他们的程序员因为他们不理解他们的计算正在做什么而被烧毁,不是因为相等的比较有什么坏的。我不相信C++需要区分正浮点和负浮点0,但它确实允许。@沃尔特:他们并不是“不安全”的。你在重复一个咒语,但这样做是错误的。@Walter:这对于比较
0
和-0
(值比较不是愚蠢的按位检查)或者实际上对于任何其他实数都没有问题。也就是说,有一组庞大的浮点值对,==
和=代码>很好;“永远不要这样做”是危言耸听和有害的。
#include <iostream>
#include <iomanip>
void print_bytes(char const *name, double d)
{
unsigned char *pd = reinterpret_cast<unsigned char*>(&d);
std::cout << name << " = " << std::setw(2) << d << " => ";
for(int i = 0 ; i < sizeof(d) ; ++i)
std::cout << std::setw(-3) << (unsigned)pd[i] << " ";
std::cout << std::endl;
}
#define print_bytes_of(a) print_bytes(#a, a)
int main()
{
double a = 0.0;
double b = -0.0;
std::cout << "Value comparison" << std::endl;
std::cout << "(a==b) => " << (a==b) <<std::endl;
std::cout << "(a!=b) => " << (a!=b) <<std::endl;
std::cout << "\nValue representation" << std::endl;
print_bytes_of(a);
print_bytes_of(b);
}
Value comparison
(a==b) => 1
(a!=b) => 0
Value representation
a = 0 => 0 0 0 0 0 0 0 0
b = -0 => 0 0 0 0 0 0 0 128