C++生成正弦表异常:数组始终填充为0,求问题排查
正弦表生成全为0的问题解决方法
问题根源在i / n的整数除法上:
i和n都是int类型,当i取值范围为0到32767时,i / n的整数除法结果始终是0- 代入后
sin(TWO_PI * 0)的结果为0,乘以amp后仍为0,最终整个数组被填充为0
修正方法是将除法操作转为浮点除法,只需把其中一个操作数强制转换为浮点数即可:
#define TWO_PI (3.14159 * 2) int16_t sineTable[32768]; const int32_t n = 32768; const int16_t amp = 2047; for ( int i = 0; i < n; i++ ) { // 将i转为double,让除法变为浮点运算 sineTable[i] = static_cast<int16_t>(sin(TWO_PI * (static_cast<double>(i) / n)) * amp); };
额外优化建议:
- 提前计算
TWO_PI / n,避免循环内重复做除法,提升效率:const double step = TWO_PI / n; for (int i = 0; i < n; i++) { sineTable[i] = static_cast<int16_t>(sin(step * i) * amp); } sin函数返回double类型,转成int16_t时用static_cast做显式类型转换,代码更规范。
内容的提问来源于stack exchange,提问作者Massimo Vantaggio
相关产品推荐
相关产品推荐

