Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个双值打印为-0";? double a=0; 双b=-42; 双结果=a*b; 虽然-0.0和0.0的位表示法不同,但它们值相同,因此-0.0==0.0将返回真。在您的情况下,结果是-0.0,因为其中一个操作数是负数_C++ - Fatal编程技术网

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