【发布时间】:2017-06-28 12:22:28
【问题描述】:
1. 问题:
我对使用 gcc v4.8.5 的 Linux 中的 DBL_MAX 和 DBL_MIN 定义有疑问。
它们在limit.h 中定义为:
#define DBL_MAX __DBL_MAX__
#define DBL_MIN __DBL_MIN__
其中__DBL_MIN__ 和__DBL_MAX__ 是特定于编译器的,可以通过以下方式获得:
$ gcc -dM -E - < /dev/null
...
#define __DBL_MAX__ ((double)1.79769313486231570815e+308L)
#define __DBL_MIN__ ((double)2.22507385850720138309e-308L)
...
我的问题是:
为什么值定义为long double,后缀为L,然后又转换回double?
2。 问题:
为什么__DBL_MIN_10_EXP__ 用-307 定义,但最小指数是-308,因为它在上面的DBL_MIN 宏中使用?在最大指数的情况下,它是用308 定义的,我可以理解,因为它被DBL_MAX 宏使用。
#define __DBL_MAX_10_EXP__ 308
#define __DBL_MIN_10_EXP__ (-307)
不是问题的一部分,只是我的观察:
顺便说一下,在 Visual Studio 2015 中使用 Windows,只定义了 DBL_MAX 和 DBL_MIN 宏,没有编译器特定的重定向到带有下划线的版本。此外,最小正双精度值 DBL_MIN 和最大双精度值 DBL_MAX 比我的 Linux gcc 编译器中的值大一点(仅与上面 gcc v4.8.5 中定义的宏相比):
#define DBL_MAX 1.7976931348623158e+308
#define DBL_MIN 2.2250738585072014e–308
此外,Microsoft 编译器将long double 限制设置为double 的值,似乎它不支持真正的long double 实现。
【问题讨论】:
-
只是猜测:由于 base10 浮点数与 base2 浮点数不完全匹配,因此获得 exact 数量可能需要强制转换。
-
VS,编译器,(不是 Windows,操作系统)支持
long double作为与double不同的类型。它只是具有与double相同的编码。所以使用long double并没有带来什么好处 -
" 此外,最小正双精度值更大,最大双精度值小于来自 mmy Linux gcc 编译器的值:"您是如何确定的?是通过比较
double"1.7976931348623158e+308` 转换为((double)1.79769313486231570815e+308L)?还是比较源代码? -
MSVC 自 18 年以来一直不符合标准。想知道为什么它不符合标准是没有意义的。
标签: gcc floating-point