繁体   English   中英

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

[英]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;
}

我期望得到(调试):

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

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

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

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

因此,您将得到零误差的简单除法。

通过使用例如1.0f作为股息来求解,例如1.0f 1.0f / (0.1f + 1.0f / b) + 0.15f

这个:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM