由于SIGFPE,算术异常导致除法运算导致错误执行

时间:2019-04-08 10:38:57

标签: c floating-point sigfpe

我编写了一种用于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;
}

我原本希望得到(调试):

  • a = 1 /(1/10 + 1/100)= 9.09

我认为对于float或double var来说,这不是一个很大的值。取而代之的是我得到了例外。

如何使用浮点数/双精度数和整数值来避免1 /(小数)时的异常?

2 个答案:

答案 0 :(得分:3)

1/101/b都是 整数 表达式,它们都产生整数0

所以您的错误除以零。

使用例如1.0f作为股息,就像1.0f / (0.1f + 1.0f / b) + 0.15f

答案 1 :(得分:1)

此:

 a = 1/(1/10 + 1/b) + 0.15;//Req 

在第一部分中进行整数除法,因为110均为int类型。您的意思是:

a = 1.f / (0.1f + 1.f / b) + 0.15f;

尤其是对于嵌入式目标,确保您的文字是float而不是double是非常重要的,因为支持可能会有所不同。