2013年1月29日 星期二

[Android] Quick Calculator - About Expression Testing

這篇呢~說明一下算式測試

在 Aspire One AOA150 小筆電計算一個長度有 5,000,000 個字元的非正規算式(包含所有函數)僅花 0.695 秒。

會挑小筆電當測試平台是因為小筆電效能較慢
比較能夠凸顯演算法的強大XD
而剛好小弟約在四年多前買小筆電(大三快升大四的時候)
沒有在手測試主要是因為不想被 UI 影響
光 EditText 的 setText() 就花超過 90% 的整體時間
而且還有其他處理時間
總之,為了省麻煩及一些因素
所以在小筆電用純 C 語言寫成 console 來測試囉

所謂非正規算式在這裡指的是非標準正確的數學算式
但卻是可以計算的算式
為了讓使用者在輸入方面能夠更快、更簡便但又不會太離譜
才搞出不少看似奇怪的算式
這些算式也不是完全沒根據,也是有經過一些驗證
能夠證明這種算式表示法是該怎麼算、哪個先算
要驗證大部分是透過 google 搜尋、一些支援算式的計算機軟體
例如 .2sin-90 這非正規算式拿去 google 搜尋會告訴你計算結果
還會幫你加括號,變成 -.2 sin(-90) (其實應該要寫成 -0.2*sin(-90) 才正確)
類似這樣的驗證,如果答案一致,那應該是沒有太大的問題了
因此我自己把所有非正規的算式列出如下:

  一般算式 ==> 非正規算式
  0.2*0.4/0.5 ==> .2*.4/.5
  50%*60%*70% ==> 50%60%70%
  -(((0.2%)%)%) ==> -.2%%%
  (-1.2)*(-3.4)*(-5.6) ==> -1.2*-3.4*-5.6
  1%*sin(50%)*cos(30%)*(20%) ==> 1%sin50%cos30%20%
  1.1*(-2+6.5)*(-7-1.1)*2.23 ==> 1.1(-2+6.5)(-7-1.1)2.23
  8*(-4)*cos(-30.1)*tan(50.2) ==> 8*-4cos-30.1tan50.2

將以上幾種非正規算式的規則拼拼湊湊,湊出一條包含以上各種非正規算式的算式:

((-.28%+.7^2.1)%%-sin(.1cos(-52.2+tan(3.3)))/100%asin(acos(atan1.09))-sinh(-cosh(.5/tanh-5.1))/log(ln(exp1%1.13))+abs(.426-ceil(floor(-1*-3.4))))

裡面的函數都完全呼叫 math.h 的函式庫,角度單位皆用弧度(Radians)去算

接著開始把那一長串算式開始複製貼上,貼到將近 10,000 個字元(沒超過)的時候,在裡面隨機穿插空白、TAB、換行,把它補到剛好 10,000 個字元為止。接著就直接將這 10,000 個字元算式一直複製貼上,貼到 5,000,000 個字元,於是就形成我最一開始講的 5,000,000 個字元算式。

由此可見,我的算式解析演算法能夠去除空白、TAB、換行字元

這個 5,000,000 算式檔案可以從這下載(不建議在手機上測試,會當掉...):
https://docs.google.com/open?id=0B87zBfTGJiioM3pvVGNmT1Uwbzg

如果想在手機測試,可下載較短的( 100,000 個字元):
https://docs.google.com/open?id=0B87zBfTGJiioREF0R0t2N1A2Z0E

有圖有真相XD,不錄影是因為會影響計算時間(點圖放大)


能算這麼快能幹麻?又用不到啊?

那當然是...爽阿....

1 則留言: