Robofun 機器人論壇
標題:
運算疑問
[打印本頁]
作者:
幸福羔羊
時間:
2012-2-1 16:21
標題:
運算疑問
各位師兄們大家好 經過了幾個月的學習大致上瞭解要怎麼用了 先感謝各位^^
我今天想問一個我一直很好奇的問題
為什麼在做運算時許多程式都是將他們分開運算
而不是一起運算呢?? 例如...
ans = sqrt(x*x + y*y); // 一般我都會這樣子寫
但是很多程式都是
x = x*x;
y = y*y;
ans = sqrt(x + y); //應該是這樣子不太敢肯定
或者運用副程式來做平方運算在帶回做更號運算
這點我並不太明白,一行全部運算與分次運算是否會有差別呢??
另外我想請問,如果感測器傳回很大的數值,例如1024(adc最大值) 定義為 int 或 long
這樣子如果開平方,會不會有問題??
如果感測器傳回很小的數值, 例如 1
這樣子如果乘上 0.xxx 運算結果會不會變成0 (太小系統無法運算??) 定義為 float
作者:
coopermaa
時間:
2012-2-1 21:29
寫成一行或分多行/副程式,只是寫法不同,應該是沒有什麼差別。
剩下兩個你寫個程式試試看就知道囉:
Serial.println(sqrt(1024));
float f = 1 * 0.0001;
Serial.printlnf(f);
作者:
mzw2008
時間:
2012-2-1 22:58
分成很多行寫通常是為了可閱讀性比較好
畢竟擠成一行有時候太複雜很難看懂到底在幹嘛
另外若是會跟電腦溝通
我會避免在arduino上面使用sqrt這種指令
而是傳回電腦以後再用
兩者速度差別太大, 對於需要極限運算的場合會比較有幫助
作者:
nichal
時間:
2012-2-2 10:23
我也來插一腳補充一下
這跟CPU的堆疊有關
如果放在同一行
一個括號就要佔掉一個堆疊(也就是一個基本快取記憶體)
一個先乘除後加減又要佔一些堆疊
一個特殊副函式運算又要呼叫一群堆疊
在某些要求大量運算的場合
堆疊數會斤斤計較
不小心讓堆疊爆了
你的程式就會做出你想像不到的怪動作
所以一般來說
我們都習慣把運算拆開來做
因為運算執行結束後
堆疊會自己釋放給其它人用
不過也不是把全部的程式都拆開來寫比較好
因為拆開會讓頁面變得很長很不好看
程式空間說不定也會變比較大
所以只能請你多多嘗試囉~~~
作者:
幸福羔羊
時間:
2012-2-2 15:44
大致上瞭解了
感謝各位師兄的回覆^^
作者:
pizg
時間:
2012-2-3 13:34
本帖最後由 pizg 於 2012-2-3 13:36 編輯
我也是新手, 也來野人獻曝一下.
為了避免讓MCU浪費過多的時間在運算上面,
最好是把開根號或三角函數之類的東西先求出值後, 再拿來使用.
例如: float v = 10 * sqrt(2); 最好是寫成
float sqrt2 = 1.414;
v = 10 * sqrt2;
例如: float v = 10 * cos(30); 最好是寫成
float cos30 = 0.866;
v = 10 * cos30;
***題外話***
突然發現版上的"回復"提示和按鈕的"復"字是否應為"覆"才是正確的?
歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/)
Powered by Discuz! X3.2