Floating point c++;14-DBL_Max和DBL_Min是否存在舍入误差?

Floating point c++;14-DBL_Max和DBL_Min是否存在舍入误差?,floating-point,double,c++14,precision,floating-accuracy,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 tr

浮点值可能有舍入错误。比如说,

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?

<> P. C和C++标准对此不明确。C标准允许在将源代码中的浮点常量(文字)转换为内部格式(如C 2011[N1570]6.4.4.2 5)时出现错误,并且没有明确禁止对扩展到的常量表达式执行此操作。但是,没有健全的C或C++实现将有不精确的值<代码> dBLYMAX < /C>或<代码> dBLLYMIN < /C> >

C++标准似乎说浮点文字必须表示精确的值,如果它们是可表示的。(C++2017[draft n4659]5.13.4 1和2010版本中的类似文本:“如果标度值在其类型的可表示值范围内,则结果为标度值(如果可表示),否则为最接近标度值的较大或较小的可表示值,以实现定义的方式选择。”),

DBL_MAX
DBL_MIN
被指定为常量表达式,而不是文本。我在C++标准的规范部分没有找到关于浮点表达式的准确性的陈述,但是在5.19 4中的注释说:虽然在某些情况下,常量表达式必须在程序翻译过程中进行求值,但在程序执行过程中可能会对其他常量表达式进行求值。由于本国际标准对浮点运算的准确性没有限制,因此未明确说明在翻译过程中对浮点表达式的求值是否会产生t在程序执行期间,计算相同表达式(或对相同值执行相同操作)的结果相同。”

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


<>如上面所述,在C++中,<代码> 1代码<双代码x=1;< /COD>必须精确地翻译,所以<代码> x <代码>将被初始化为没有舍入错误的一个。C标准不指定这个,但是没有健全的C实现将在代码< >双x=1;< /C>中舍入错误。舍入错误来自困难或IM。计算中的可能性,而不是来自随机工件。

基于上一点,这是否意味着如果x=1.0,则断言(x==1.0)总是正确的吗?我想我看到了一些其他问题,如果有一个舍入错误,如果变量被设置为文字。@ USE18119:我在检查C++ +5.134 1之前输入了最后一段,这似乎可以准确地表示可以准确地翻译的文字,所以<代码> 1 < /C>应该总是精确地1。(1)浮点的定义总是可表示的,浮点的定义是一些基数乘以基数乘以某个幂,所以1总是可表示为1倍幂零的基数,除非你想考虑奇数浮点格式,其中指数零点是越界的。@user18119:另外,C标准允许文字翻译时有舍入误差,即使它们可以精确表示,原因是编写好的软件来执行翻译大量数字和指数的文字所需的算法是很困难的。通常可以使用元素中所教的方法来完成但这有时可能需要编写软件来完成数百位数的算术运算,人们希望在小型机器上使用C语言。此后发表的论文都有很好的算法,因此现在做这项工作比较容易……但这一困难只适用于具有多位数和大指数的数字。翻译<代码> 1 < /代码>和其他简单数字总是容易的,并且应该通过任何C实现正确地执行,即使标准在技术上允许不准确。好,有意义。奇怪的是,C标准没有被更新为类似于C++,但是我认为这是由于后台兼容性。