Ela*_*782 4 c++ floating-point precision casting
我有一个带浮点数的函数,我正在用它们做一些计算,我想在返回的结果中尽可能保持准确性.我读到,当你乘以两个浮点数时,你的有效数字加倍.
因此,当两个浮点数相乘时,例如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;
}
Run Code Online (Sandbox Code Playgroud)
将两个浮点数相乘而不进行强制转换时,将使用float精度(即截断)计算结果,然后将其转换为double.
要以double计算结果,您需要至少将一个操作数转换为double.然后整个计算将以double结束(并且所有浮点值都将被转换).但是,这将创造同样的减速.减速很可能是因为将数字从float转换为double并非完全无关紧要(不同的位大小以及指数和mantisa的范围).
如果我这样做并控制函数定义,我会将所有参数传递为double(我通常使用double到处都是,在现代计算机上,float与double计算之间的速度差异可以忽略不计,只有问题可能是在大型值数组上运行时的内存吞吐量和缓存性能).
顺便说一句.实际上对精度很重要的情况不是乘法,而是加法/减法 - 这就是精度可以产生很大差异的地方.考虑添加/减去1e + 6和1e-3.