【问题标题】:Best way to check if double equals negative infinity in C++在 C++ 中检查 double 是否等于负无穷大的最佳方法
【发布时间】:2015-02-23 21:22:42
【问题描述】:

我发现了这个: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;
}

【问题讨论】:

  • isinf&lt; 0 怎么样?
  • 是的,@Quirliom 说的
  • 你可以检查无穷大的值吗? 大吃一惊
  • @marsh infinity 在 IEEE754 浮点意义上的超出范围。
  • @marsh 因为它的行为就像你期望无穷大的行为一样。例如,a) 如果a 是无穷大,那么a/2 仍然是无穷大,而如果aMAX_VALUE(它是有限的)并且b) a/bNaN,则NaN 仍然是无穷大两者都是无穷大,而如果两者都是MAX_VALUE,则为1

标签: c++ c++11 numerical numerical-computing


【解决方案1】:

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

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

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

如果x 是其他浮点类型,请酌情更改double

std::numeric_limits 在标准头文件&lt;limits&gt; 中定义。不要忘记将其添加到您的 #include 列表中。

【讨论】:

    【解决方案2】:

    x == -1.0 / 0.0

    如果x 为负无穷,则此表达式的计算结果为真。

    如果您愿意包含cmath,那么x == - INFINITY 更具可读性。

    假设浮点类型映射到 IEEE 754 格式,那么它们中的每一个都有自己的无穷大。 1.0 / 0.0double 无穷大。 INFINITY 的类型无关紧要,因为“通常的算术转换”将负责匹配 == 的左侧和右侧的类型。

    【讨论】:

    • 如果您不想包含&lt;cmath&gt;,您可以使用这些宏:#define POSINF (1.0 / 0.0)#define NEGINF ((-1.0) / 0.0)#define NAN (0.0 / 0.0)。您可能会收到一些关于常量溢出的警告,但它们应该可以工作。
    • 我没有意识到 -Inf == -Inf,这对我来说实际上有点像一个错误,但如果它有效,那么对我有用!
    • 这是平台相关的,不是吗?
    • @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。
    • 是的,所以你应该在你的回答中提到这一点 :) 并且 OP 应该检查std::numeric_limits::is_iec559
    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2012-01-28
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多