浮点除法和隐式轮次

Float Division and implicit round

本文关键字:除法      更新时间:2023-10-16

我在我编写的一段代码中发现了一种奇怪的行为,当我尝试将其从程序中复制出来(即使用 MATLAB)时不会发生。

我正在对数组进行操作,如下所示:

a[i] = a[i] / (sqrt(b[i]) * sqrt(c[i]));

其中 abc 是浮点型数组。abc先验除法的值范围从20006000000

对于数组的所有元素,运算

的结果为零,但分别查看分子和分母的值,对于给定元素,运算89509.0 / 90240,375等于 0,991895258

所以,我想知道为什么使用float的程序内的完整操作不起作用,并且它按预期单独工作。可能是由于数小时的混淆调试?

当我遇到类似的情况时,我发现将其分解为步骤并查看哪些步骤行为正常,哪些步骤行为不正确通常会有所帮助。例如,为此,可以将其分解为以下内容:

float sqrtb = sqrt(b[i]);
float sqrtc = sqrt(c[i]);
float divisor = srqtb * sqrtc;
float dividend = a[i];
float quotient = dividend / divisor;
a[i] = quotient;

现在我可以浏览每个项目并查看它失败的地方(如果失败)。事实是,当我这样做时,我经常在创建步骤时发现问题,然后修复它。