在C++中检查双精度浮点数是否等于负无穷的最佳方式是什么?

8
我找到了这个网址:http://en.cppreference.com/w/cpp/numeric/math/isinf,但它似乎只检查正无穷或负无穷。 我想检查一个值是否恰好等于负无穷,或者换句话说,是否为log(0)。
谢谢您的回答!基于以下响应,下面是一些代码,显示可行方法。
#include <iostream>
#include <cmath>
#include <math.h>
using namespace std;
int main()
{
    double c = std::log(0.0);
    auto result = c == - INFINITY;
    cout << result << endl;
    return 0;
}

3
isinf< 0 怎么处理? - Sinkingpoint
1
你可以检查无穷大的值吗?惊呆了 - marsh
3
"marsh infinity" 在 IEEE754 浮点数的意义下表示超出范围。 - Stefano Sanfilippo
1
@marsh 因为它的行为就像你期望无限大的行为一样。例如,a) 如果a是无限大,则a/2仍然是无限大,而如果a是MAX_VALUE(有限的),则它将是一个有限的数字;b) 如果两者都是无限大,则a/bNaN,而如果两者都是MAX_VALUE,则它将是1 - Stefano Sanfilippo
酷!今天我学到了新东西。谢谢。 - marsh
显示剩余2条评论
2个回答

23

显而易见和明确的怎么样?

要检查一个 double x 是否为负无穷大,请检查

x == -std::numeric_limits<double>::infinity()

如果x是其他浮点类型,请根据需要更改double。 std::numeric_limits在标准头文件中定义。不要忘记将其添加到您的#include列表中。

9

x == -1.0 / 0.0

这个表达式的值为真,当且仅当x是负无穷大。

如果你愿意引入cmath,那么x == - INFINITY更易读。

假设浮点类型映射到IEEE 754格式,那么每种类型都有自己的无穷大。 1.0 / 0.0 是一个double无穷大。 INFINITY的类型并不重要,因为“通常的算术转换”将确保匹配==左右两侧的类型。


1
如果您不想包含<cmath>,可以使用这些宏:#define POSINF (1.0 / 0.0)#define NEGINF ((-1.0) / 0.0)#define NAN (0.0 / 0.0)。您可能会收到有关常量溢出的警告,但它们应该能够正常工作。 - triple_r
我之前没意识到 -Inf == -Inf,这看起来有点像是个 bug,但如果它能正常工作,那对我来说就行! - evolvedmicrobe
这是依赖于平台的,不是吗? - Lightness Races in Orbit
@LightnessRacesinOrbit 是的,但是任何认真对待IEEE 754的平台(在C++中,可以使用std::numeric_limits::is_iec559来确认)都可以像这个答案一样工作,因为IEEE 754将1/0定义为+inf,-(+inf)定义为-inf,并且当x为-inf时,等式x == -inf为真。唯一的问题是平台是否实现了IEEE 754。C++还允许中间结果具有额外的精度,但是无论精度如何,inf始终是inf。 - Pascal Cuoq
是的,你应该在你的回答中提到这一点 :) OP 应该检查 std::numeric_limits::is_iec559 - Lightness Races in Orbit
Visual Studio不能编译1.0 / 0.0,它会抱怨除以零(至少在默认设置下)。 - Duke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接