我为 MCU 编写了一个算法,该算法在对除法结果进行更多计算之前执行两个并行电阻的表达式。调试时这些值没有意义;它们太大了,float var 没有更新它们的初始值。
所以我去了https://www.onlinegdb.com/并在那里尝试了我的算法的一部分。执行代码时,它会在以下行启动一个非正常退出的算术异常:
a = 1/(1/10 + 1/b) + 0.15;
首先我使用浮点数,但我认为异常可能是由溢出引起的,因此我使用 double 将变量存储做得更大,但出现了相同的异常。然后我尝试做同样的事情,但说:
a = (1/10 + 1/b) + 0.15;
并且执行成功了!
所以,我看到'1'运营商是原因。但我不明白为什么以及如何修复它(不使用math.h)。
代码是这样的:
#include <stdio.h>
float a = 0.0;
int b = 100;
int main()
{
a = 1/(1/10 + 1/b) + 0.15;//Req
b = a; //get int part
a *= 10;//fractionary part converted to dec
if ((a - b*10)>5) b++;
printf("float: %f , int: %i",a,b);
return 0;
}
我期待得到(调试):
- a = 1/(1/10 + 1/100) = 9.09
我认为这不是一个适合浮点数或双变量的大值。而不是这个,我得到了例外。
如何使用浮点数/双精度值和 int 值以避免 1/(较小的值)时出现异常?