![](/img/trans.png)
[英]program received signal SIGFPE, Arithmetic exception when using modulo in C
[英]Operation with division resulting in error execution because of SIGFPE, Arithmetic exception
我编写了一种用于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来说,这不是一个很大的值。 取而代之的是我得到了例外。
如何使用浮点数/双精度数和int值来避免1 /(较小值)时的异常?
1/10
和1/b
都是整数表达式,都产生整数0
。
因此,您将得到零误差的简单除法。
通过使用例如1.0f
作为股息来求解,例如1.0f
1.0f / (0.1f + 1.0f / b) + 0.15f
。
这个:
a = 1/(1/10 + 1/b) + 0.15;//Req
在第一部分中进行整数除法,因为1
和10
均为int
类型。 你的意思是:
a = 1.f / (0.1f + 1.f / b) + 0.15f;
特别是对于嵌入式目标,确保您的文字是float
而不是double
可能非常重要,因为支持可能会有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.