1.问题:
我有一个关于Linux下gcc v4.8.5中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)
...
我的问题是:
为什么定义的值以
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)
不是问题的一部分,只是我做出的观察:
顺便说一下,在使用Windows和Visual Studio 2015时,只定义了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
此外,微软编译器将
long double
的限制设置为 double
的值,似乎不支持真正的 long double
实现。
long double
作为与double
不同的类型。它只是具有与double
相同的编码。因此,在那里使用long double
几乎没有什么好处。 - chux - Reinstate Monicadouble
类型的"1.7976931348623158e+308"与"((double)1.79769313486231570815e+308L)"之间的转换吗?还是在比较源代码? - chux - Reinstate Monicasnprintf()
函数就是一个很好的例子,两个平台的行为不同,而且微软并不关心标准规定... - Andre Kampling