C++03标准是否保证
我怀疑答案是否定的,但我很乐意被证明是错误的。所谓“足够小”,指的是某个值被C++03保证,并且可以从通过
编辑:显而易见(现在我已经确认),
此外,对于
C90和C99均声明
那么问题是什么?这是否意味着
如果是这样,那么C99中的
C99§5.2.4.2.2 / 9中对
double
可以精确表示足够小的非零整数?如果不是,那C++11呢?注意,我这里并没有假定符合IEEE标准。我怀疑答案是否定的,但我很乐意被证明是错误的。所谓“足够小”,指的是某个值被C++03保证,并且可以从通过
std::numeric_limits<double>
提供的值计算出来。编辑:显而易见(现在我已经确认),
std::numeric_limits<double>::digits
和DBL_MANT_DIG
是同一回事,std::numeric_limits<double>::digits10
和DBL_DIG
也是同一回事,C++03和C++11都是如此。此外,对于
DBL_MANT_DIG
和DBL_DIG
的含义,C++03推迟到C90,C++11推迟到C99。C90和C99均声明
DBL_DIG
的最小允许值为10,即10个十进制数字。那么问题是什么?这是否意味着
double
可以精确表示多达10位十进制数字的整数?如果是这样,那么C99中的
DECIMAL_DIG
和C99 §5.2.4.2.2 / 12中的以下声明还有什么用呢?使用DECIMAL_DIG位将(至少)double转换为十进制数,然后再转回去应该是恒等函数。
C99§5.2.4.2.2 / 9中对
DBL_DIG
的解释如下:Number of decimal digits, 'q', such that any floating-point
number with 'q' decimal digits can be rounded into a
floating-point number with 'p' radix 'b' digits and back again
without change to the q decimal digits,
{ p * log10(b) if 'b' is a power of 10
{
{ floor((p-1) * log10(b)) otherwise
FLT_DIG 6
DBL_DIG 10
LDBL_DIG 10
如果有人能帮助我解包这个文件,我会很高兴。
<climits>
头文件定义的一部分。基本上是从其他标准中借鉴而来的。 - Joseph MansfieldDECIMAL_DIG
宏不是C++03的一部分。 - Kristian Spangsege