【Arduino】進行數學運算時,需要注意的小地方

【Arduion】數學運算注意(精選圖片)

你有在使用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預設使用整數型態來做計算,

因此我們只要將運算的部分改成正確的資料型態,

這樣不論是浮點數運算,還是超過整數範圍的運算,

我們的運算結果就會是正確的了。

最後!! 你喜歡這篇文章,或是這篇文章對你有幫助的話,也歡迎分享出去給需要的人,訂閱免費電子報獲得最新資訊😄😄😄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *