你有在使用Arduino計算一些數值時,發現運算結果不正確,看起來怪怪的嗎?
就讓我們來看看是哪些小地方沒注意,導致最後運算錯誤。
浮點數運算
我們來看看下列算式,在經過Arduino計算後,x的值會是多少?
float x = 5/2;
使用serial,來打印出我們的x值。
什麼?! x的值竟然會是2.00,怎麼會這樣呢?
這是因為Arduino是預設使用整數型態(int)計算及暫存
本來5/2應該要等於2.5,但在計算時預設是整數型態,因此變成2。
解決的方式有下列兩種:
1.在算式中至少有一個數字包含小數點
float x = 5/2.0;
2.用小括號來轉換資料類型,會將後面數值轉換成括號內的資料型態。
float x = 5/(float)2;
上述兩種方法都可以讓運算結果變成2.5。
大數值運算
我們從前面得知Arduion預設是用整數型態來進行運算,
因此當運算結果超過整數的範圍-32768~32767,計算上就會出現溢位錯誤。
讓我們來看看下列算式
long ans = 4000*100; //計算結果會是6784
為何會是6784呢?
我們來看整數範圍-32768~32767,把32767-(-32768)+1=65536,這個數值溢位後剛好會是0。
而數學計算乘積暫存為整數型態,400000除以65536的商數會是6,餘數會是6784,
這說明他已經跑了6圈的整數範圍,最後剩下的就會是6784。
那我們如何避免計算時造成的溢位呢?
就是強制轉換計算時的資料型態,在計算數字後面加入設定數值類型的格式字元。
long ans = 4000L*100L; //計算結果會是400000
格式字元 | 說明 | 範例 |
---|---|---|
L或l | 強制轉換成長整數(long) | 4000L |
U或u | 強制轉換成無正負號(unsigned)的整數 | 32800U |
UL或ul | 強制轉換成無正負號的長整數(unsigned long) | 7295UL |
總結
由於Arduino預設使用整數型態來做計算,
因此我們只要將運算的部分改成正確的資料型態,
這樣不論是浮點數運算,還是超過整數範圍的運算,
我們的運算結果就會是正確的了。
最後!! 你喜歡這篇文章,或是這篇文章對你有幫助的話,也歡迎分享出去給需要的人,訂閱免費電子報獲得最新資訊😄😄😄