2010年1月10日 星期日

LabVIEW 的 rem 及 [ ] 函數

上個月中退伍了之後在台大當助理,為了實驗室的需要,這一陣子都在學習 LabVIEW 這個程式開發工具 :



這是 NI (National Instruments) 公司所開發出來的一種程式開發工具,使用的程式語言是一種超高階的圖形化語言,又稱 G 語言。寫程式時分成兩個部分,一個是給使用者的操作面板,又稱人機介面 (下圖上);另一個是內部的程式碼,又稱程式方塊圖 (下圖下) : [1]




看起來好像很簡單,因為不用寫 (背) 程式碼,而是用圖形化的元件用線連在一起。LabVIEW 的程式是以 "資料流" 的方式在執行,也就是同一平面上所有元件的資料一起流動,而不像傳統程式是一行一行地執行程式碼,不過思維邏輯還是很類似的。

這篇要談 LabVIEW 裡兩個超爛的數學函數 rem 及 [ ]。每個程式語言都會內建一些數學函數供程式運算,如果是 MatLab 或 SciLab 這類數學軟體會內建更多。(我自己想寫的另外一個程式還必須要有積分跟微分,那真的不知道怎麼辦了) 畢竟程式很需要這些東西,很多程式根本就跟數學無關,程式碼裡還是一堆這種東西。

LabVIEW 雖然是工程用的程式開發工具,但是數學方面的函數還是不夠多,圖形化的運算元件就那麼幾個,還好有提供 "Formula Node",所以可以自己去寫,但是好像也沒比圖形元件多多少....(Formula Node 是一個方框,決定好輸入輸出後可以直接寫方程式運算,還能設條件,如下圖)



這樣就算了 !!!! 重點是還有寫得很爛的 !!!! 這就是這篇文章的主題 -- rem 及 [ ] 函數。

先說 [ ] 函數,有上過高中數學的人都應該知道這是高斯函數,意指它會取數值的整數部分,比如說 :

1.1 -> 1
2.9 -> 2

可是在 LabVIEW 裡的解釋是 "最接近的整數"。這沒什麼,它要這樣設定就這樣設,了不起變成四捨五入,這也都好解決。問題是它的進位原則很差勁,甚至我一開始以為根本沒有規律 !! "四捨五入" 跟 "最接近的整數" 的盲點在哪呢 ? 沒錯,就是 x.5 這種值 (x 屬於整數)。前者要進位,後者咧 ? 在中間怎麼辦 ? 我就想它至少會統一一下嘛 ! 結果很靠杯,它是在 x 為奇數時進位,偶數時不進位,例如 :

0.5 -> 0
1.5 -> 2
2.5 -> 2
3.5 -> 4

非常荒謬而且可笑,哪有這種數學函數 ?

另外一個就是 rem 函數,這是一個求餘數的函數。比如說 rem(51,3)=0,因為整除;rem(61,5)=1 因為餘數為 1,可是 rem 函數本身存在缺陷。就我的測試,rem 計算的方法跟半殘 [ ] 函數有關。比如說 :

rem(48,3)=0
rem(49,3)=1
rem(50,3)= -1

居然餘數會出現負值 !!!! 被除數或除數有一個是負值也就算了,偏偏都不是。原因在哪呢? 我懷疑 rem 計算的方式是 :

rem(a,b) = a - b*[a/b]

[a/b] 就是將 a/b 的浮點數值取詭異的 [ ] 函數運算。懂了嗎 ? 只要 a/b 的第一位小數點大於等於 5,就會讓 rem 函數給出負值 !!!! (噢不,如果是只有一位小數,而且是 5,還要看整數部分是奇數還偶數咧) 夠腦殘了吧 !!

我想了很久,終於想到讓 rem 及 [ ] 函數正常工作的方法 :

rem : 以 X1 與 X2 相除的餘數為例,輸出為 Y
if X1 * X2 >=0
   Y = X1 - X2*[X1/X2]          if rem(X1,X2)=0
         X1 - X2*[X1/X2-0.5]    else
else
   Y = X1 - X2*[X1/X2]          if rem(X1,X2)=0
         X1 - X2*[X1/X2+0.5]   else

動手腳就在那個加減 0.5,讓 X1/X2 一定會取到整數,整除的情況則不去動它。如此一來 rem 函數就修正好了,把它做成單一包裝的 *.vi 檔來用,以後就會比較方便。

唔,這種事情還是少發生的好,不然程式寫到一半發現 LabVIEW 自己出包真的會很想砸電腦....這個故事也告訴我們,做事要謹慎.....

附註
1. 這兩張例圖是用搜尋隨便找的,並不是同一個程式。

3 則留言:

  1. 因為發現負數的錯誤而修改了一下 orz
    還有學弟告訴我他們大一普物實驗時是教 "四捨六入五成雙"
    ....我對四捨五入的印象只在小學教的,根本沒有這種事情..
    不知道是不是後來教材有改 ?

    回覆刪除
  2. 還有四捨五入奇數進偶數不進,就是你說的那樣!!

    回覆刪除
  3. 看來真的是教材改了,我在小學的時候根本沒聽過這種事情,就算是後來在學校處理數據,也沒聽別人那樣用過,不然我怎麼會完全沒印象 .........

    Anyway .... 反正也不會再用這玩意了 .. :P

    回覆刪除