【发布时间】:2017-01-19 01:39:26
【问题描述】:
我有一个带浮点数的函数,我正在用它们进行一些计算,并且我希望在返回的结果中保持尽可能高的准确性。我读到,当您将两个浮点数相乘时,有效数字的数量就会增加一倍。
所以当两个浮点数相乘时,例如float e, f; 和我做double g = e * f,这些位什么时候会被截断?
在下面的示例函数中,我是否需要强制转换,如果需要,在哪里?这是一个紧密的内部循环,如果我将 static_cast<double>(x) 放在每个变量 a b c d 周围使用它,我会减速 5-10%。但我怀疑我不需要单独转换每个变量,并且只在某些位置,如果有的话?或者在这里返回一个双精度并没有给我任何好处,我也可以只返回一个浮点数?
double func(float a, float b, float c, float d) {
return (a - b) * c + (a - c) * b;
}
【问题讨论】:
-
您只需要一个转换,因为其他操作数将为您转换“如果任一操作数是双精度,另一个操作数将转换为双精度” 来源:en.cppreference.com/w/cpp/language/… 但是这仍然会给你同样的减速。关于返回双精度的第二个问题取决于您如何处理返回的结果。
-
是的,但就我而言,两个(所有)操作数(返回类型除外)都是浮点数?
-
如果您在任何地方使用
double,您可能会获得更好的性能(以及更好的准确性)。这样可以节省转换开销。 -
@5gon12eder - “如果你在任何地方都使用 double,可以获得更好的性能(以及更好的准确性)”......不要忘记:“以 RAM 消耗为代价”的价格标签
标签: c++ casting floating-point precision