【问题标题】:What is inf in gdbgdb中的inf是什么
【发布时间】:2023-03-24 03:42:01
【问题描述】:

我正在调试一个 C++ 程序。有一个 double 类型的变量 x,gdb 将其值打印为 inf。然而,即使x 的值没有改变,下面的表达式也会返回false

x == std::numeric_limits<double>::max()

当 gdb 说inf 时,它不是指这种类型的最大可能值(双精度)吗?如果不是,那是什么意思?

【问题讨论】:

    标签: c++ gdb numeric-limits


    【解决方案1】:

    表示x == std::numeric_limits<double>::infinity()

    浮点实现不一定必须支持无穷大,但常见的 - IEEE754 - 可以。

    从 C++11 开始,您可以使用std::isinf(x) 来测试浮点数是否是无限的。

    【讨论】:

      【解决方案2】:

      不,无穷大不是最大值;从这个意义上说,它根本不是一个“价值”。

      与 NaN 一样,无穷大是 IEEE754 浮点数可以采用的“特殊值”。它们中的两个表现出不寻常的属性(例如 NaN != NaN),并且不在您选择的浮点类型的数值范围内的数轴上。

      虽然 1.79769e+308(我的系统上的std::numeric_limits<double>::max())是一个非常大的数字,但它距离无穷大还有很长的路要走。介于两者之间的每一个潜在值(实际上是无限的)在这种类型中是无法表示的。如果“min”和“max”函数只返回-infinf,则它们对于double 的数值域将没有用处。

      【讨论】:

      • 我很确定 +INF 和 -INF 位于数轴上。特别是,他们坐在两端。更正式地说,两个无穷大都是相对于有限数排序的。
      • 另外,“在 1.79E308 和 +INF 之间的每个潜在值(实际上是无穷大)”有点误导。在 1.0 和 2.0 之间,或在 0.01 和 0.02 之间,或者 pi 和 e 之间,有理数的数量完全相同。我承认,数学可能相当违反直觉。
      • 我觉得特别有用的这种种类无穷大的定义是对于任何 y 值都大于 y 的数字 x。
      • @MSalters:他们没有,std::numeric_limits<double>::min()std::numeric_limits<double>::max() 函数证明——甚至 define——。您应该阅读您所指的整个句子 - 我说的是您选择的浮点类型的数值范围的数轴。
      • @MSalters: “在 1.0 和 2.0 之间,或在 0.01 和 0.02 之间,或者 pi 和 e 之间,有理数的数量完全相同” 再次,没有。浮点类型具有固定的精度。这是double,不是抽象的有理数。