17

double问题是关于在 C++ 中为数据类型建模无穷大。我需要它在头文件中,所以我们不能使用像numeric_limits.

是否存在代表最大值的已定义常数?

4

9 回答 9

26

浮点数(例如双精度数)实际上可以保持正负无穷大。常量 INFINITY 应该在你的 math.h 头文件中。

进行标准潜水,发现文字:

4 宏 INFINITY 扩展为浮点类型的常量表达式,表示正或无符号无穷大(如果可用);否则为在翻译时溢出的浮点类型的正常量。

在部分7.12 Mathematics <math.h>


然后当然你有帮助函数isinf来测试无穷大(也在 math.h 中)。

7.12.3.3 isinf 宏

int isinf(real-floating x);

说明:isinf 宏确定其参数值是否为无穷大(正数或负数)。首先,以比其语义类型更宽的格式表示的参数被转换为其语义类型。然后根据参数的类型确定。

返回:当且仅当它的参数具有无限值时,isinf 宏才返回一个非零值。

于 2011-12-27T02:44:57.810 回答
21

numeric_limits函数都是 constexpr ,因此它们可以作为编译时常量正常工作(假设您使用的是当前版本的 C++)。所以std::numeric_limits<double>::infinity()应该在任何情况下工作。

即使您使用的是旧版本,这仍然适用于您不需要编译时间常数的任何地方。从您的问题中不清楚您的使用是否真的需要编译时间常数;只是在标题中并不一定需要它。

如果您使用的是旧版本,并且确实需要编译时间常数,那么INFINITYcmath 中的宏应该适合您。它实际上是float无穷大的值,但它可以转换为double.

于 2011-12-27T03:39:49.167 回答
9

不知道为什么你不能在头文件中使用 std::numeric_limits 。但也有这从 ANSI C 继承:

#include <cfloat>

DBL_MAX
于 2011-12-27T02:48:25.727 回答
1

我以为答案是“ 42.0 ”;)

这篇文章可能很有趣:

http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

或这个:

http://www.cplusplus.com/reference/clibrary/cfloat/

MAXimum 最大有限可表示浮点数:

FLT_MAX  1E+37
DBL_MAX  1E+37
LDBL_MAX 1E+37  
于 2011-12-27T02:46:20.583 回答
1

可以使用 DBL_MAX。这可以在 float.h 中找到,如下所示

    #define DBL_MAX         1.7976931348623158e+308 /* max value */
于 2011-12-27T05:09:06.793 回答
1

也许在您的 C++ 环境中float.h,请参阅http://www.gamedev.net/topic/392211-max-value-for-double-/ (DBL_MAX)

于 2011-12-27T02:48:35.023 回答
1

来自维基百科

0x 7ff0 0000 0000 0000   = Infinity
0x fff0 0000 0000 0000   = −Infinity
于 2011-12-27T02:52:05.827 回答
0
#include <cmath>
...
double d = INFINITY;

您可以在( )中找到INFINITY定义:<cmath>math.h

表示正无穷或无符号无穷大的常量表达式(float如果可用);否则float在翻译时溢出的类型正常量。

于 2011-12-27T02:50:41.047 回答
-1

这不行吗?

const double infinity =  1.0/0.0;
于 2011-12-27T02:47:34.090 回答