我编写了一种用于MCU的算法,该算法执行两个并联电阻的表达式,然后对除法结果进行更多计算。调试时,这些值没有意义;它们太大,并且float var不会更新其初始值。
所以我去了https://www.onlinegdb.com/,在那里我尝试了一部分算法。执行代码时,它将启动非正常退出的行,并在以下行出现算术异常:
a = 1/(1/10 + 1/b) + 0.15;
首先,我正在使用float,但是我认为异常可能是由溢出引起的,因此我使用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;
}
我原本希望得到(调试):
我认为对于float或double var来说,这不是一个很大的值。取而代之的是我得到了例外。
如何使用浮点数/双精度数和整数值来避免1 /(小数)时的异常?
答案 0 :(得分:3)
1/10
和1/b
都是 整数 表达式,它们都产生整数0
。
所以您的错误除以零。
使用例如1.0f
作为股息,就像1.0f / (0.1f + 1.0f / b) + 0.15f
。
答案 1 :(得分:1)
此:
a = 1/(1/10 + 1/b) + 0.15;//Req
在第一部分中进行整数除法,因为1
和10
均为int
类型。您的意思是:
a = 1.f / (0.1f + 1.f / b) + 0.15f;
尤其是对于嵌入式目标,确保您的文字是float
而不是double
是非常重要的,因为支持可能会有所不同。