Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++_Floating Point_Precision - Fatal编程技术网

C++ 使精度最大化的操作顺序

C++ 使精度最大化的操作顺序,c++,floating-point,precision,C++,Floating Point,Precision,我在这些操作中使用浮点数: 这两者中哪一个更精确 (a*b)/c 或 (a/c)*b 这到底重要还是取决于形势?如果是这样的话,在什么情况下我应该选择哪一种?真的,如果你不使用double,那么你就被误导了,你也不在乎精度 否则,如果第一个结果略低于下一个更高的二次方,则会得到最佳错误界限。例如,在计算(pi*e)/sqrt(2)时,您可以通过计算(e/sqrt(2))*pi来获得最佳误差范围,因为e/sqrt(2)≈ 1.922接近2。结果接近次高二次方的相对误差较低 对于大量项目的加

我在这些操作中使用浮点数:

这两者中哪一个更精确

  • (a*b)/c

  • (a/c)*b

这到底重要还是取决于形势?如果是这样的话,在什么情况下我应该选择哪一种?

真的,如果你不使用double,那么你就被误导了,你也不在乎精度

否则,如果第一个结果略低于下一个更高的二次方,则会得到最佳错误界限。例如,在计算(pi*e)/sqrt(2)时,您可以通过计算(e/sqrt(2))*pi来获得最佳误差范围,因为e/sqrt(2)≈ 1.922接近2。结果接近次高二次方的相对误差较低


对于大量项目的加法和减法,最好先减去大小相等且符号相反的项目(如果y/2,则精确计算x-y)≤ x≤ 2y),并以其他方式组合数字,得出最小的可能结果

真的,如果你不使用double,那么你就被误导了,你也不在乎精度

否则,如果第一个结果略低于下一个更高的二次方,则会得到最佳错误界限。例如,在计算(pi*e)/sqrt(2)时,您可以通过计算(e/sqrt(2))*pi来获得最佳误差范围,因为e/sqrt(2)≈ 1.922接近2。结果接近次高二次方的相对误差较低


对于大量项目的加法和减法,最好先减去大小相等且符号相反的项目(如果y/2,则精确计算x-y)≤ x≤ 2y),并以其他方式组合数字,得出最小的可能结果

如果你关心精度,为什么不使用双精度呢?我关心精度,但不是那么多。由于我被迫使用其中一个,我想知道哪一个更好。我想这取决于值。如果
a*b
导致溢出(无穷大),则精度会降低。OTOH,如果
a/c
导致下溢(非正常,或0.0f),则精确度较低。而且,
(1/3)*3
不如
(1*3)/3
准确。因此,如果没有溢出的机会,我会使用
a*b/c
。在中间计算中没有下溢和溢出的情况下,任何一个表达式都应该在定点乘后除的情况下计算错误,对于浮点,尽管在相同的精度范围内没有更好的方法,但请考虑一下……如果您关心精度,为什么不使用双打呢?我关心的是准确度,但不是那么多。由于我被迫使用其中一个,我想知道哪一个更好。我想这取决于值。如果
a*b
导致溢出(无穷大),则精度会降低。OTOH,如果
a/c
导致下溢(非正常,或0.0f),则精确度较低。而且,
(1/3)*3
不如
(1*3)/3
准确。因此,如果没有溢出的机会,我会使用
a*b/c
。在中间计算中没有下溢和溢出的情况下,任何一个表达式都应该在定点乘然后除的情况下计算错误,对于浮点,尽管在相同的精度范围内没有更好的方法,但考虑一下……为了澄清,我首先关心的是速度,然后是精度,所以双倍不是一个选项。为什么你认为浮动会比双倍快?请参阅和许多其他帖子,了解为什么情况可能并非如此。原因很简单,正如您链接的帖子中所述,有更多的数据会更快地填充CPU缓存。为了澄清这一点,我首先关心速度,然后才关心精度,所以双精度不是一个选项。为什么您认为浮点比双精度更快?请参阅和许多其他帖子,了解为什么情况可能并非如此。原因很简单,正如您链接的帖子中所述,数据越多,CPU缓存的填充速度就越快。