gpt4 book ai didi

c++ - 与正零 (+0.0) 相比,负零 (-0.0) 的行为

转载 作者:可可西里 更新时间:2023-11-01 14:56:38 26 4
gpt4 key购买 nike

在我的代码中,

float f = -0.0; // Negative 

负零相比

f == -0.0f

结果将为 true

但是

float f = 0.0; // Positive

负零相比

f == -0.0f

此外,结果将是 true 而不是 false

为什么两种情况的结果都是真的?


这里是 a MCVE to test it (live on 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

最佳答案

C++11 引入了类似 std::signbit() 的函数它可以检测带符号的零,以及 std::copysign()如果实现支持带符号的零(例如,由于使用 IEEE 浮点),它可以在浮点值之间复制符号位。这些函数的规范实际上并不要求实现支持不同的正零和负零。撇开这些不谈,我不知道 C++ 标准中有任何引用甚至提到了带符号的零,更不用说比较它们的结果了。

C++ 标准也没有规定任何浮点表示法 - 这是实现定义的。

虽然不是确定的,但这些观察结果表明,对有符号零的支持或比较它们的结果将取决于实现支持的浮点表示形式。

IEEE-754 是现代实现(即主机系统上的编译器)使用的一种常见(尽管不是唯一)浮点表示法。当前(2008 年发布)版本的 IEEE-758“IEEE 浮点运算标准”第 5.11 节第二段说(粗体强调我的)

Four mutually exclusive relations are possible: less than, equal, greater than, and unordered. The last case arises when at least one operand is NaN. Every NaN shall compare unordered with everything, including itself. Comparisons shall ignore the sign of zero (so +0 = −0). Infinite operands of the same sign shall compare equal.

关于c++ - 与正零 (+0.0) 相比,负零 (-0.0) 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45795397/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com