【问题标题】:Operation with division resulting in error execution because of SIGFPE, Arithmetic exception由于 SIGFPE、算术异常,除法运算导致错误执行
【发布时间】:2019-04-08 10:38:56
【问题描述】:

我为 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/(较小的值)时出现异常?

【问题讨论】:

    标签: c floating-point sigfpe


    【解决方案1】:

    1/101/b 都是 integer 表达式,它们的结果都是整数 0

    所以你有一个简单的除以零错误。

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

    【讨论】:

    • 你有理由这样做 #include double a = 0.0;诠释 b = 100; int main() { a = 1.0/(1.0/10.0 + 1/(float)b) + 0.15; b = 一个;一个 *= 10;如果 ((a - b*10)>5) b++; printf("float: %f, int: %i",a,b);返回0; } 是固定的。谢谢。
    【解决方案2】:

    这个:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2020-05-24
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      相关资源
      最近更新 更多