乐鑫技术交流
直播中

李俊

7年用户 1346经验值
私信 关注
[问答]

建立了一个声级计,在这个过程中发生了溢出情况怎么解决?

嗨伙计。我试图建立一个声级计并遇到了一个问题,到目前为止我无法通过谷歌搜索解决。其余的项目代码并不重要,因为即使我输入固定值也会出现问题。因此,我将跳过 OLED 显示器和其他东西的设置:
代码:全选long levelDb = 0;

levelDb = 20 * log(30 / 220) + 60

display.print("Decibel: ");
display.println(levelDb);


预期结果:20
返回结果:-2147483648
我认为这是某种溢出,但我不太明白为什么会发生,因为 levelDb 很长。对于 30 的所有值,这种情况一直发生,直到对数内部的计算 >=1,然后返回所需的结果。有人可以向我解释为什么会发生这种情况吗?如果您感觉很慷慨,该如何解决?

回帖(1)

杨勇

2024-1-4 14:30:43
这个问题可能是因为你使用了整数数据类型而不是浮点数数据类型。log函数返回的是浮点数,如果你将其赋值给一个 long 类型的变量,就会出现精度问题,产生不正确的结果。

你可以尝试将数据类型改为 float,或者将计算过程中的 long 类型变量转换为 float 数据类型,以避免溢出问题。例如:

float levelDb = 0.0;
levelDb = 20 * log10(30 / 220.0) + 60;
display.print("Decibel: ");
display.println(levelDb);

其中,log10函数是将一个数取以10为底的对数,这可以避免精度问题产生。在计算 30/220 时,将其中一个数改为 220.0 可以将其转换为浮点数类型。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分