在 C++ 中表示浮点数无穷大的方法

Ways to represent float infinity in C++

提问人:Cythonista 提问时间:7/23/2023 最后编辑:Konrad RudolphCythonista 更新时间:7/23/2023 访问量:119

问:

我想为我的程序在 C++ 中表达浮点无穷大。 我遇到了两种实现此目的的方法:使用 和 .INFINITYstd::numeric_limits<float>::infinity()

这两种选择似乎都有效,但我不确定哪一个是更好的选择。 一方面,是 math.h 中定义的简单宏,使其易于使用。 另一方面,是 C++ STL 的函数,并且是 STL 的一部分,这似乎是一种传统方式。INFINITYstd::numeric_limits<float>::infinity()<limits>

综上所述:

我应该在我的 C++ 程序中使用 or 表示浮点无穷大吗? 哪一种被认为是更好的做法,我是否应该注意任何性能或可移植性注意事项?INFINITYstd::numeric_limits<float>::infinity()

C++ STL 约定无 穷大

评论

4赞 Konrad Rudolph 7/23/2023
简单规则:当可以使用强类型函数时,不要使用(旧版)宏。
1赞 Cythonista 7/23/2023
非常感谢您的信息!你能把它作为答案发布出来,以便我接受吗?
0赞 Artyer 7/23/2023
你有特别的理由使用而不是吗?floatdouble
0赞 Cythonista 7/23/2023
很少。我现在使用的库适用于两者。我只想把无穷大作为一个参数,所以精度对我来说不是问题。P.S. 我意识到该函数使用 double 作为参数。将类型从 更改为 ,谢谢!floatdouble
0赞 Pete Becker 7/23/2023
@KonradRudolph -- INFINITY 的类型是 ,就像 的返回类型一样。floatstd::numeric_limits<float>::infinity()

答:

6赞 Konrad Rudolph 7/23/2023 #1

在 C 语言中引入了宏来表达在语言中无法很好地表达的东西。在此特定示例中,命名一个编译时常量。INFINITY

C++ 在语言中引入了不同的方法,允许您表达过去在 C 中需要宏的相同内容(在许多情况下,但不是所有情况下)。关于这种特殊情况,C++ 有一种以各种方式命名编译时常量的方法。

与 相比,使用具有以下优点:INFINITYstd::numeric_limits<float>::infinity()

  • 它在命名空间内有适当的范围,这意味着其他代码可以使用标识符来表示其他内容,而不会导致名称冲突。infinity
  • 它是强类型并命名一个类型,因此可以专门用于 的不同值,并且可以在泛型上下文中无需转换即可使用。std::numeric_limits<T>::infinity()T
  • 它是语言的一部分(而不是单独的预处理器语言),这使得第三方工具(例如IDE)更容易与之交互。

由于历史原因,是一个函数,但这并不是很重要,因为(因为它是)您可以在任何可以使用任何其他常量表达式的上下文中使用它。infinity()constexpr

反之,与 相比,使用 具有以下优点:std::numeric_limits<float>::infinity()INFINITY

  • 它更短。

评论

0赞 prapin 7/23/2023
我们可以添加一个参数:如果使用 modules 和 C++23 ,宏将不起作用,因为宏永远不会在模块中导出。但会起作用。import std;INFINITYstd::numeric_limits<T>::infinity()
0赞 Pete Becker 7/23/2023
的类型是 。没有比这更强的类型了。INFINITYfloat
0赞 Konrad Rudolph 7/23/2023
@PeteBecker 好吧,也许我应该说“正确输入”。;-)