Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 3799|回復: 5
打印 上一主題 下一主題

運算疑問

[複製鏈接]
跳轉到指定樓層
1#
發表於 2012-2-1 16:21:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位師兄們大家好 經過了幾個月的學習大致上瞭解要怎麼用了 先感謝各位^^
我今天想問一個我一直很好奇的問題
為什麼在做運算時許多程式都是將他們分開運算
而不是一起運算呢?? 例如...

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
2#
發表於 2012-2-1 21:29:05 | 只看該作者
寫成一行或分多行/副程式,只是寫法不同,應該是沒有什麼差別。

剩下兩個你寫個程式試試看就知道囉:

Serial.println(sqrt(1024));

float f = 1 * 0.0001;
Serial.printlnf(f);
3#
發表於 2012-2-1 22:58:29 | 只看該作者
分成很多行寫通常是為了可閱讀性比較好
畢竟擠成一行有時候太複雜很難看懂到底在幹嘛

另外若是會跟電腦溝通
我會避免在arduino上面使用sqrt這種指令
而是傳回電腦以後再用
兩者速度差別太大, 對於需要極限運算的場合會比較有幫助
nichal 該用戶已被刪除
4#
發表於 2012-2-2 10:23:44 | 只看該作者
我也來插一腳補充一下
這跟CPU的堆疊有關
如果放在同一行
一個括號就要佔掉一個堆疊(也就是一個基本快取記憶體)
一個先乘除後加減又要佔一些堆疊
一個特殊副函式運算又要呼叫一群堆疊
在某些要求大量運算的場合
堆疊數會斤斤計較
不小心讓堆疊爆了
你的程式就會做出你想像不到的怪動作

所以一般來說
我們都習慣把運算拆開來做
因為運算執行結束後
堆疊會自己釋放給其它人用

不過也不是把全部的程式都拆開來寫比較好
因為拆開會讓頁面變得很長很不好看
程式空間說不定也會變比較大
所以只能請你多多嘗試囉~~~
5#
 樓主| 發表於 2012-2-2 15:44:16 | 只看該作者
大致上瞭解了
感謝各位師兄的回覆^^
6#
發表於 2012-2-3 13:34:44 | 只看該作者
本帖最後由 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;


***題外話***
突然發現版上的"回復"提示和按鈕的"復"字是否應為"覆"才是正確的?
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-5-17 14:47 , Processed in 0.157907 second(s), 10 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表