個人網(wǎng)站可以做社交類型網(wǎng)絡(luò)營銷案例題
必須類型一致的判斷才能正常
double a=-0.4;
if(a < -0.2){print("低電平");
}
這段代碼可能未必如你所愿的運(yùn)行. < 小于號的判斷一定要類型一致, 尤其是牽扯到雙精度類型的判斷… 一定要保證符號 兩邊的數(shù)據(jù)類型一致才有可能得到你想要的結(jié)果. 代碼里 -0.4 默認(rèn)可能是float類型. 有的編譯器默認(rèn)是double類型. 一定要測試過才行.
不要使用 malloc函數(shù)獲取內(nèi)存
float* aa= (float*)malloc(1000 * sizeof(float));
float* bb= (float*)malloc(1000 * sizeof(float));
float* cc= (float*)malloc(1000 * sizeof(float));for (i = 0; i < signal->size; i++)
{ sindata[i] = sin(aa[i]);cosdata[i] = cos(aa[i]); printf("%d at Phase %f sin is %f, cos is %f \r\n",i,referencePhase, referenceSin[i] , referenceCos[i] );
}
如果是這樣的代碼, 在PC上基本上是不會出什么問題, 如果是在STM32單片機(jī)上. 這么寫估計(jì)會跑出來一大堆的問題.
為了這個問題我調(diào)試了大半天. 最終的原因在 動態(tài)分配內(nèi)存 malloc() 函數(shù)上, 不一定能正確獲得存儲空間.
期初以為是float的精度不一致的問題, 逐行 printf 對比后才發(fā)現(xiàn). 是malloc() 的問題.
改成
float aa[1000]= {0};
float bb[1000]= {0};
float cc[1000]= {0};for (i = 0; i < signal->size; i++)
{ sindata[i] = sin(aa[i]);cosdata[i] = cos(aa[i]); printf("%d at Phase %f sin is %f, cos is %f \r\n",i,referencePhase, referenceSin[i] , referenceCos[i] );
}
把存儲數(shù)據(jù)的變量改成全局靜態(tài)的. 基本上不會出錯.
不要在函數(shù)中初始化變量,尤其是大的數(shù)組變量.
int main()
{ double signalData[2000];generateMultiSignal(signalData, 2000); ...
}
這段代碼中signalData 犯了2個錯誤,
1.在main函數(shù)中定義,
2.這里只是聲明一個數(shù)組變量, 并非是初始化一個數(shù)組變量.
改成下面這么寫就沒問題了.
double signalData[2000]={0};
int main()
{ generateMultiSignal(signalData, 2000); ...
}
強(qiáng)制類型轉(zhuǎn)換會丟失一個數(shù)值
float anglea = 6.2900;
int indexb = (int)(anglea * 100);
printf("indexbbb: %d, angle: %f\n", indexb, anglea);
理論上應(yīng)該得到的是
indexbbb: 629, angle: 6.2900
但實(shí)際上得到的是
indexbbb: 628, angle: 6.2900
比實(shí)際值少了一個1?
float anglea = 6.29000001;
int indexb = (int)(anglea * 100);
printf("indexbbb: %d, angle: %f\n", indexb, anglea);
這樣輸出的值就是正常的. 具體原因不知.
開啟DSP加速. 引用的lib庫文件一定要正確.
引用 arm_cortexM4l_math.lib 時
arm_sin_f32(123456)
輸出123456
正確的lib庫應(yīng)該是用 lf 的浮點(diǎn)庫.
arm_cortexM4lf_math.lib
害我找了1天的bug啊…
另外如何開啟DSP加速, 請參考下面的幾篇文章
https://blog.csdn.net/WandZ123/article/details/125593908
https://zhuanlan.zhihu.com/p/462911261
https://blog.csdn.net/m0_74923693/article/details/136857288
printf 必須數(shù)據(jù)格式一致
double age =18.0;
printf("age %f \r\n", age);
這會輸出
age 0.00
正確代碼如下
double age =18.0;
printf("age %f \r\n", (float)age);