gpt4 book ai didi

c - 溢出错误,RMS 值显示错误

转载 作者:太空宇宙 更新时间:2023-11-04 07:27:01 27 4
gpt4 key购买 nike

我正在测量交流电压并计算 ADC 的均方根值。

我有一个包含 128 个信号样本的数组。在计算平方数时出现错误。

unsigned long int calval=0;
unsigned int loop;
float adcbufval;
for(loop=0;loop<128;loop++)
{
printf("adcval %d = %d\t ", loop, adc_temp[loop]);
calval = (adc_temp[loop])*(adc_temp[loop]);
printf("\t %ld \n", calval);

}

输出:

adcval 1 = 168 28224
adcval 2 = 32 1024
adcval 3 = -88 7744
adcval 4 = -211 44521 // sqr(211) 44521 , it fine here
adcval 5 = -314 33060 // sqr(314) 98596-65536 = 33060 instead of 98596.
adcval 6 = -416 41984
adcval 7 = -522 10340
adcval 8 = -655 35809
adcval 9 = -773 7705
adcval 10 = -889 3889

虽然我将“calval”定义为无符号长整型(范围 0-4,294,967,295),但它在 65536 值时溢出。在普通的 C 编译器中它工作正常。有什么建议吗?

硬件是 dsPIC30f5011/MPLAB 8.8x

最佳答案

你没有展示它(或者我忽略了它),但是如果 adc_temp[] 是一个 int 数组,那么为了安全地平方值你必须至少在在这样做之前乘以 long。否则乘法的结果仍然是int,并且只有在发生溢出后,才会转换为unsigned long进行赋值。

像这样:

calval = (long)(adc_temp[loop])*(adc_temp[loop]);

如果 adc_temp[] 也是无符号的,则该转换可能是 unsigned long

关于c - 溢出错误,RMS 值显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17489547/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com