Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 浮点运算的精度_C++ - Fatal编程技术网

C++ 浮点运算的精度

C++ 浮点运算的精度,c++,C++,浮点运算通常近似于相应的算术运算,因为在许多情况下,精确的算术结果不能用内部数字格式表示。但是如果我有一个程序,所有的数字都可以用IEEE754单精度精确表示,会发生什么呢?例如,考虑: float a = 7; float b = a / 32.0; float c = a + b; float d = c - a; assert( d == b ); 是否可以安全地假设在这种情况和类似情况下,数值计算的结果与精确的算术结果相同?我认为这种代码可以在每台实际的机器上运行。这是正确的吗 编辑这

浮点运算通常近似于相应的算术运算,因为在许多情况下,精确的算术结果不能用内部数字格式表示。但是如果我有一个程序,所有的数字都可以用IEEE754单精度精确表示,会发生什么呢?例如,考虑:

float a = 7;
float b = a / 32.0;
float c = a + b;
float d = c - a;
assert( d == b );
是否可以安全地假设在这种情况和类似情况下,数值计算的结果与精确的算术结果相同?我认为这种代码可以在每台实际的机器上运行。这是正确的吗


编辑这个问题不是关于标准的内容,而是关于现实世界。我很清楚,从理论上讲,一个人可以创造一个合格的引擎,而这将失败。我不在乎,但我想知道这是否在现有机器上工作。< /P> < P>不,因为C++标准不需要以IEEE 754格式存储浮点值。

< P>“实际”机器在执行标准时非常小心(只需记住)。但要仔细检查,i386系列的机器确实在寄存器中使用了一些额外的位,这些位在进入/离开内存时被切断,因此仅在寄存器中进行的计算得到的结果与某些中间结果溢出到内存时的结果不同

也可以看看大卫·戈德伯格的


在任何情况下,对一个可以精确表示的数字进行“四舍五入”(或以其他方式弄乱)都没有任何意义。

但是,对于使用IEEE 754的实现,或者至少是其中大部分的实现,又如何呢?这是一个相当重要的案例,因为它是常见的,而且有许多超出C++标准所保证的含义。是否有任何实现与IEEE 754单精度不兼容?在IEEE 754的情况下,我在工作草案中找不到任何允许实现内部取整的地方(我目前无法访问该标准),因此看起来应该如此。但要当心乐观主义者,如果你真的打算这么做的话。@pentadecagon:GCC在许多体系结构上都不是完全符合IEEE 754的,除非你告诉它,这需要软件实现。@Kerrek据我所知,这只适用于像无穷大、非规范化或类似的情况。你知道任何情况下,只要所有数字都在IEEE 754单精度规定的范围内,数值运算的结果就会与精确的算术结果不同吗?对不起,我不明白。这是否意味着“是”或“否”?fpu寄存器中关于额外位的位适用于所有x86处理器标量fpu。只是,如果编译器知道它的代码将在带有SSE的处理器上运行,那么它将使用向量寄存器。