完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
嗨伙计。我试图建立一个声级计并遇到了一个问题,到目前为止我无法通过谷歌搜索解决。其余的项目代码并不重要,因为即使我输入固定值也会出现问题。因此,我将跳过 OLED 显示器和其他东西的设置:
代码:全选long levelDb = 0; levelDb = 20 * log(30 / 220) + 60 display.print("Decibel: "); display.println(levelDb); 预期结果:20 返回结果:-2147483648 我认为这是某种溢出,但我不太明白为什么会发生,因为 levelDb 很长。对于 30 的所有值,这种情况一直发生,直到对数内部的计算 >=1,然后返回所需的结果。有人可以向我解释为什么会发生这种情况吗?如果您感觉很慷慨,该如何解决? |
|
相关推荐
1个回答
|
|
这个问题可能是因为你使用了整数数据类型而不是浮点数数据类型。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 可以将其转换为浮点数类型。 |
|
|
|
只有小组成员才能发言,加入小组>>
920 浏览 1 评论
552浏览 6评论
461浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
445浏览 5评论
446浏览 4评论
417浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 06:15 , Processed in 0.721621 second(s), Total 48, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号