gpt4 book ai didi

c++ - 0 和 -0 浮点值有什么区别?

转载 作者:行者123 更新时间:2023-11-30 00:50:22 25 4
gpt4 key购买 nike

Visual Studio 2013 中的这段代码:

double a = 0.0;
double b = -0.0;

cout << (a == b) << " " << a << " " << b;

打印 1 0 -0ab 有什么区别?

最佳答案

C++ 不保证区分 +0 和 -0。这是每个特定数字表示的一个特征。浮点运算的 IEEE 754 标准确实做出了这种区分,即使数字变为零也可用于保留符号信息。 std::numeric_limits不会直接告诉您是否有可能的带符号零。但是如果std::numeric_limits<double>::is_iec559是真的那么你可以在实践中假设你有 IEEE 754 表示,因此可能是负零。


由“gmch”在 a comment 中注明, C++11 标准库检查零符号的方法是使用 std::copysign ,或更直接地使用 std::signbit ,例如如下:

#include <iostream>
#include <math.h> // copysign, signbit

using namespace std;

auto main() -> int
{
double const z1 = +0.0;
double const z2 = -0.0;

cout << boolalpha;
cout << "z1 is " << (signbit( z1 )? "negative" : "positive") << "." << endl;
cout << "z2 is " << (signbit( z2 )? "negative" : "positive") << "." << endl;
}

没有copysignsignbit ,例如对于 C++03 编译器,一种检测负零的方法 z是检查是否1.0/z是负无穷大,例如通过检查它是否只是负面的。

#include <iostream>
using namespace std;

auto main() -> int
{
double const z1 = +0.0;
double const z2 = -0.0;

cout << boolalpha;
cout << "z1 is " << (1/z1 < 0? "negative" : "positive") << "." << endl;
cout << "z2 is " << (1/z2 < 0? "negative" : "positive") << "." << endl;
}

但是虽然这可能在大多数实现上都有效,但它在形式上是*未定义的行为。

需要确保表达式计算不会陷入困境。


*) C++11 §5.6/4 “如果 / 的第二个操作数或 %为零,行为未定义”

关于c++ - 0 和 -0 浮点值有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25277539/

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