【问题标题】:Does the cmath macro INFINITY always works for double?cmath 宏 INFINITY 是否总是适用于 double ?
【发布时间】:2020-11-21 02:22:15
【问题描述】:

我正在使用 cmathINFINITYdouble 数字,到目前为止我还没有看到任何问题:根据我的经验,它总是评估为 double 无穷大。例如:

#include <iostream>
#include <cmath>

int main()
{
    double x = INFINITY;
    std::cout << x << std::endl; // prints "inf" as expected
    return 0;
}

但是根据C++ referencecplusplus.comINFINITY 似乎只能保证float 的计算结果为无穷大。对于double(和long double),是否总是保证评估为无穷大?

我知道 C++ 标准库 std::numeric_limits 解决了这个问题,但我正在使用内存有限的嵌入式系统,所以我宁愿使用我已有的 (cmath) 而不是添加另一个头文件。

编辑:我使用的是 C++11。

【问题讨论】:

  • 如果您的平台正确实现了 IEEE 754,您可以简单地评估 1.0 / 0.0 以获得输入为双精度的无穷大。
  • @idclev:没错,std::isinf 有一个double 过载,但我不明白为什么这会证明INFINITY 对于double 总是正确的。 std::isinfINFINITY 毕竟是两个不同的东西。
  • 无穷大的浮点值将转换为无穷大的双精度值。大概编译器会足够聪明,可以在编译时进行转换。
  • @cdhowie 这行得通,但我更愿意确定标准库的作用而不是依赖技巧。
  • @Mµvh773 这不是“技巧”。这就是定义 IEEE 754 浮点的工作方式。

标签: c++ floating-point double infinity cmath


【解决方案1】:

是的。根据 C++14 标准:

  1. float 类型的纯右值可以转换为double 类型的纯右值。值不变。

-- N4296 [conv.fpprom]

如果值在提升为 double 之前为无穷大,则提升后将保持无穷大。

【讨论】:

  • 我没有使用 C++14,但我想 C++11 也是如此。
  • @Mµvh773 好吧,您总是可以...指定您在问题中使用的版本。
猜你喜欢
  • 2019-02-12
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
相关资源
最近更新 更多