最小正常IEEE单精度数的大小约为1.18e-38,最小的非正规数使您降至约1.40e-45.作为结果,7.82e-43的操作数将仅包括大约9个非零位,这本身可能已经成为问题,甚至在进行乘法之前(其结果将在单精度中下溢到零).因此,您可能还想查看产生这些微小数字的任何上游计算.
如果这些小数字是数学表达式中的中间项,则将该表达式重写为不涉及微小中间体的数学上等价的表达将是解决该问题的一种方式.或者你可以通过2的幂的因子来缩放一些操作数(以便不会因缩放而产生额外的舍入).例如,缩放比例为2 ^ 24 = 16777216.
最后,您可以将部分计算切换为双精度.为此,只需引入double类型的临时变量,对它们执行计算,然后将最终结果转换回float:
float r, f = 7.721155e-43f;
double d, t;
d = (double)f; // explicit cast is not necessary, since converting to wider type
t = d * d;
[... more intermediate computation, leaving result in 't' ...]
r = (float)t; // since conversion is to narrower type, cast will avoid warnings
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2690 次 |
最近记录: |