stm32冪指數運算時的錯誤顯示與解決方案
阿新 • • 發佈:2021-02-18
本文記錄了我在stm32裡面對一個整數進行適當的四則運算後,作為10的指數次冪進行冪指數運算時,遇到的問題,以及最終解決問題的方法。上傳於此,用於記錄,也為了給大家參考。
背景
因為要用到RSSI轉距離(公式如下)
d
=
1
0
∣
R
S
S
I
∣
−
A
0
10
×
n
d=10^{\frac{|RSSI|-A_0}{10\times n}}
d=1010×n∣RSSI∣−A0
原有RSSI因為存在int型裡面了,所以不能直接減去
A
0
A_0
A0後直接除以10n,而是要轉成float或double。
問題
用程式碼將int轉成double後:
juli=(double) distance[num];
juli=pow(10,((juli-30)/20))*10;
distance[num]=(int)juli; //距離,單位是分米
用以下程式碼進行顯示:
printf("\r\ndistance為:(單位是分米)\r\n\r\n");
{
USART_SendData(USART1, distance[num]/100+0x30);//向串列埠1傳送資料
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
USART_RX_STA=0;
USART_SendData(USART1, distance[num]/10%10+0x30);//向串列埠1傳送資料
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
USART_RX_STA=0;
USART_SendData(USART1, distance[num]%10+0x30);//向串列埠1傳送資料
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
USART_RX_STA=0;
}
十進位制按照百位、十位、個位分別儲存,並由串列埠輸出,但是用串列埠檢視,發現計算結果是亂碼:
手動計算一下,RSSI為71時,按照公式
d
=
10
×
1
0
∣
R
S
S
I
∣
−
30
10
×
2
d=10\times10^{\frac{|RSSI|-30}{10\times 2}}
d=10×1010×2∣RSSI∣−30計算的距離應該是1122分米,也就是一百多米,因為沒有考慮到會出現四位數,所以最高位出現亂碼。
解決方法
既然位數不對,那麼如果新增到四位數顯示,可以嗎?
也不行,調成四位數,也就是加上模1000的結果,還是計算錯誤。其實最大的問題是int位數不夠,要把它改成長整型。如下:
juli=(double) distance[num];
juli=pow(10,((juli-30)/20))*10;
distance[num]=(long)juli; //計算距離,單位是分米。這裡long為juli轉成long型
//同理,在開頭定義變數型別時,distance的定義也要從int改成long。
測試一下,成功