如何减少C/C++浮点舍入

如何减少C/C++浮点舍入,c++,c,floating-point,floating-accuracy,C++,C,Floating Point,Floating Accuracy,我知道的唯一诀窍是,当对一组数字求和时,不要一次只做一个——将它们分组,使相加的数量大致相同。例如,对一个庞大的随机数数组求和,可以成对递归求和。我知道的唯一诀窍是,当你对一组数字求和时,不要一次只求一个,而是对它们进行分组,这样加法的数值大小大致相同。例如,要对一个庞大的随机数数组求和,可以成对递归求和。您可以启用FPU的扩展浮点精度,以便在内部使用10个字节。这就是我们所用的 您还可以对数字进行排序,以便对类似大小的数字执行操作。您可以启用FPU的扩展浮点精度,以便在内部使用10字节。这就是

我知道的唯一诀窍是,当对一组数字求和时,不要一次只做一个——将它们分组,使相加的数量大致相同。例如,对一个庞大的随机数数组求和,可以成对递归求和。

我知道的唯一诀窍是,当你对一组数字求和时,不要一次只求一个,而是对它们进行分组,这样加法的数值大小大致相同。例如,要对一个庞大的随机数数组求和,可以成对递归求和。

您可以启用FPU的扩展浮点精度,以便在内部使用10个字节。这就是我们所用的


您还可以对数字进行排序,以便对类似大小的数字执行操作。

您可以启用FPU的扩展浮点精度,以便在内部使用10字节。这就是我们所用的


您还可以对数字进行排序,以便对大小相似的数字执行操作。

是整个数学领域,它不会简化为一些可以盲目应用的技巧

是一个完整的数学领域,它不会简化为一些可以盲目应用的技巧

人们得到了关于这方面的博士论文,所以你在这里不会得到真正可靠的建议,只有提示。一个技巧是避免减去数值相当接近的数字;这就放大了噪音的影响。

人们得到了关于这方面的博士论文,所以你在这里不会得到真正可靠的建议,只有提示。一个技巧是避免减去数值相当接近的数字;这会放大噪声位的影响。

您可以做很多小事情,例如在单个表达式中执行尽可能多的浮点运算,并确保运算的所有输入都转换为浮点格式。在浮点和整数之间切换时,请确保在整数转换之前向浮点添加因子0.5,以确保值四舍五入到最接近的整数。使用双精度或长双精度将提高精度,从而降低舍入/累积误差的重要性


你会有一些舍入错误,所以你真的想把它们推过你想要的意义。一种选择是使用扩展精度浮点软件库,如。使用库的好处是精度更高,但操作速度较慢。

您可以做很多小事情,例如在单个表达式中执行尽可能多的浮点操作,并确保操作的所有输入都转换为浮点格式。在浮点和整数之间切换时,请确保在整数转换之前向浮点添加因子0.5,以确保值四舍五入到最接近的整数。使用双精度或长双精度将提高精度,从而降低舍入/累积误差的重要性


你会有一些舍入错误,所以你真的想把它们推过你想要的意义。一种选择是使用扩展精度浮点软件库,如。使用库的好处是精度更高,但操作速度较慢。

请解释为什么2/3在C/C++中不精确,但在汇编中精确--但是你可能想研究GMP库之类的东西;为了清晰起见,请参见我编辑的示例。我不关心受IEEE标准限制的浮点数的绝对精度,也不关心只有2的幂才能准确表示为浮点数的事实,而是关心运行数百万次的循环中浮点舍入误差的累积。首先,阅读,经典,必读。对于特定的问题,有一些算法,例如。这是起点。然后在C++中,有一些浮点运算的精度比浮点/双精度高,这有一些麻烦的问题。请解释2/3是如何在C/C++中精确的,但在汇编中是精确的;但是你可能想研究GMP库之类的东西;为了清晰起见,请参见我编辑的示例。我不关心受IEEE标准限制的浮点数的绝对精度,也不关心只有2的幂才能准确表示为浮点数的事实,而是关心运行数百万次的循环中浮点舍入误差的累积。首先,阅读,经典,必读。对于特定的问题,有一些算法,例如。这是起点。然后
在C++中,有些浮点运算的精度比浮点/双精度高,这有一些麻烦的问题。有没有办法保证全部80位被使用,而不是从C/C++中舍入?我的理解请纠正我错了,如果你连续地增加大量的数字,总和将保留在注册表中,并使用扩展精度,直到它被写回内存。这可能是真的,但没有保证。我认为在一些现代编译器上,80位寄存器被完全绕过,它们使用SSE代替。@MarkRansom与一些编译器GCC一起使用,即使在发出SSE2代码时,使用仍然存在的80位寄存器与使用long double类型一样简单。对于其他编译器Visual C,即使在发出基于堆栈的历史FPU指令时,long double始终为64位。是否有任何方法可以保证使用完整的80位,而不是从C/C++取整?我的理解是,如果我错了,请更正,如果您不断添加大量数字,总和将保留在注册表中,并使用扩展精度,直到它被写回内存。这可能是真的,但没有保证。我认为在一些现代编译器上,80位寄存器被完全绕过,它们使用SSE代替。@MarkRansom与一些编译器GCC一起使用,即使在发出SSE2代码时,使用仍然存在的80位寄存器与使用long double类型一样简单。对于其他编译器Visual C,即使在发出基于历史堆栈的FPU指令时,long double也始终为64位。