0

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

4

2 回答 2

3

1/10和都是整数表达式,都产生1/b整数。0

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

通过使用 eg1.0f作为被除数来解决它,比如1.0f / (0.1f + 1.0f / b) + 0.15f

于 2019-04-08T10:42:50.737 回答
1

这个:

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

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

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

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

于 2019-04-08T10:44:12.987 回答