c ++ 14-DBL_Max和DBL_Min是否会舍入错误?

时间:2018-06-23 00:03:39

标签: floating-point double c++14 precision floating-accuracy

浮点值可能会产生舍入误差。例如,

double x = 1.0;
// x might be something like 1.00000000000000001

是否总是保证像DBL_Max和DBL_Min这样的常量具有与它们想要的值相同的值(对于使用它们的任何系统)?舍入错误可能会影响它们吗?例如,在下面的代码中:

double x = DBL_Max;
assert (x == DBL_Max); // is this assertion guaranteed to always be true?

1 个答案:

答案 0 :(得分:0)

C和C ++标准对此并不明确。 C标准允许在从源代码的浮点常量(文字)到内部格式(如C 2011 [N1570] 6.4.4.2 5)的转换过程中出错,并且对于DBL_MAX的常量表达式并没有明确禁止这样做和DBL_MIN扩展到。但是,任何理智的C或C ++实现都不会具有DBL_MAXDBL_MIN的不正确值。

C ++标准似乎确实说,浮点文字如果可以表示,则必须产生精确的值。 (C ++ 2017 [草案n4659] 5.13.4 1和2010版本中的类似文字:“如果缩放值的类型在可表示值的范围内,则结果为缩放值(如果可表示),否则为可表示的较大或较小的值但是,DBL_MAXDBL_MIN被指定为常量表达式,而不是文字。我没有在C ++标准的规范部分中找到有关浮点表达式准确性的声明,但是在5.19 4中有一个注释说:“尽管在某些情况下必须在程序翻译过程中对常量表达式求值,但在某些情况下常量表达式可以在程序转换过程中求值。程序执行。由于此国际标准没有对浮点运算的准确性施加任何限制,因此尚不确定翻译期间对浮点表达式的求值是否与对相同表达式的求值(或对相同值的相同运算)产生相同的结果。 )。”

因此,从技术上讲,该标准并不要求x == DBL_MAX之后为double x = DBL_MAX;为真,但实际上,它应该始终为真。

如上所述,在C ++中,1.0中的double x = 1.0;必须正确翻译,因此x将被初始化为无舍入错误的整数。 C标准没有对此进行指定,但是没有明智的C实现会在double x = 1.0;中产生舍入错误。四舍五入误差是由计算中的困难或不可能引起的,而不是由随机伪像引起的。