为什么这个双值打印为"-0"?

hof*_*fmn 23 c++

double a = 0;
double b = -42;
double result = a * b;
cout << result;
Run Code Online (Sandbox Code Playgroud)

结果a * b-0,但我预料到了0.我哪里做错了?

Naw*_*waz 31

该位表示-0.00.0不同的,但它们是相同的值,那么-0.0==0.0将返回true.在你的情况,result-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);
}
Run Code Online (Sandbox Code Playgroud)

输出(demo @ ideone):

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 
Run Code Online (Sandbox Code Playgroud)

正如你可以看到自己的最后一个字节-0.0是从不同的最后一个字节0.0.

希望有所帮助.

  • @Walter - 浮点比较定义明确且有用.害怕他们的程序员已经被烧毁,因为他们不了解他们的计算是做什么的,而不是因为平等比较有什么不好. (10认同)
  • 我不相信C++*需要区分正负浮点零,但它确实允许它. (3认同)
  • @Walter:他们并非"不安全".你正在重复一个口头禅,并且做错了. (2认同)
  • @Walter:将`0`与`-0`进行比较(值比较不是哑位式检查),或者实际上几乎任何其他实数都没有问题.也就是说,有一组_enormous_浮点值对,`==`和`!=`是_just fine_; "从来没有这样做"是危言耸听和有害的. (2认同)