2005年09月10日

語言的使用,會訓練並影嚮我們的思考方式。在電腦程式語言中,特別突顯這個現象

Tags: 邏輯 維根斯坦

有人拿著一道程式語言的題目來問我如何解?我想了一下解法,再看了一下他原來的解法,發現語言的使用,會訓練並影嚮我們的思考方式。在電腦程式語言中,特別突顯這個現象。例如,一個熟悉組合語言的人 (例如我),在處理下面這個問題時,就算同樣用 C 語言,他的答案就和一個不曾使用過組合語言的人 (我朋友) 完全不同。


問題: 將10進位數字表示文字轉換成16進位數字表示文字。例: 輸入 255 ,輸出 0xFF 。讓我們看看一個用過組合語言的人,是如何寫出答案 (就是我寫的)。

/* C Language */

我是直接用遮罩的方式,再查表取字,以位元運算為主,這是組合語言式的正統做法。而我朋友是用數學換算,那似乎是數學式的正統做法。從計算機原理來看,我的方法最佳。在此無意說明計算機原理,僅討論語言與思維方式。兩種方法毫無疑問地都是邏輯結構 (不論數學或是電腦程式語言,這是語言本身的限定) ,但符號型式卻相差很大,這是因為語言使用上的特性,訓練並影嚮了我們的思維。

組合語言的使用,訓練了我對16進位數值與位元運算的思考習慣。一般數學,並不是這樣教人演算的。以前還有個數學研究所的人,問過我「超長整數」 (超過 unsigned long long 範圍的數) 相加的 C 語言程式怎麼寫。我一看他的構想就知道他還沒擺脫數學思考,我告訴他這不能直接用數值 (內建數值型態) 去做,要用字串儲存數,一字元對一字元地相加與進位。其實用過組合語言的話,非常快就想通了 (用組合語言寫更快)。

我數學不好,所以有個怪僻,只要有人拿什麼函數模型來請我幫他寫出電腦程式,我就會要他先把模型中的所有運算過程 (特別是微積分的) ,全部轉成只有加減乘除及邏輯運算的型式 (連指數、對數都不能用) ,我才能幫他寫程式。幾乎每個人都被這要求打退堂鼓。我數學不好,不了解原因。有任何數學好的人,可以告訴我這要求很難做到嗎?


Posted by shirock at 樂多Roodo! │03:01 │回應(12)引用(2)閱讀隨筆
樂多分類:學術/學習 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/467296
引用列表:
將現象或狀態定質,定質而後定量,定量而後能計算,卻是不少實證主義的社會科學家所堅信的正確科學研究方法。
Re: 語言的使用,會訓練並影嚮我們的思考方式。【石頭閒語】 at 2005年10月22日 23:52
本篇文章引用石頭大大的《自「寫程式需要懂數學」是個偽命題》 本篇文章引用石頭大大的《語言的使用,會訓練並影嚮我們的思考方式。》 本篇文章引用石頭大大的《Re
電腦與數學【界列芝部】 at 2007年11月14日 20:19
回應文章
因為指數(以上...)都是用來描述狀態 而不是單純的數量計算

另外一旦做出來就能終生白吃白喝,被人拱到與愛因斯坦相同的地位XD
Posted by Leaies at 2005年10月20日 21:25
邏輯系統是二進位系統,偽與真,0與1。

以我對數學的理解,數學家普遍認為偽與真是邏輯原子,所有數學式與數學分子都是由邏輯原子結構而成,也必然可解析回邏輯原子的型式,亦即解析回只用偽與真來表達的型式。

我所要求的,不過是要對方把微積分或含指數、對數等高級數學分子的數學式,解析回基礎的數學分子與邏輯原子的型式。在邏輯系統中,我亦十分堅信所有數學式必能以邏輯原子的型式表達。如果有任何人說他寫的數學式不能解析回去,那我便認為那個數學式是偽的、如小孩子塗鴉一般的圖案,那不能稱為一個數學式。

另一方面,將現象或狀態定質,定質而後定量,定量而後能計算,卻是不少實證主義的社會科學家所堅信的正確科學研究方法。這正對應到將指數、對數等高級數學分子解析回基礎數學分子的過程。

我並不信社會科學中實證主義那一套,其中一個理由在於,他們連我上述的要求都做不到。
Posted by 遊手好閒的石頭成 at 2005年10月22日 22:41
...基本上對數、三角函數都是可以用普通的運算表達出來的,不然一般的計算機跟math.h裡的函式是怎麼算出來的?
Posted by St. Kevin at 2005年12月12日 22:38
如果那個人能把複雜的數學式解析成加減乘除~我想程式也已經寫出來了~寫程式難的就是邏輯分析~寫大家都會寫~
Posted by GDE at 2006年06月22日 10:10
GDE 重覆了我的問題,但沒有回答我的問題。建構數學式依賴的也是邏輯分析,為何那些人無法解析回去?
Posted by 遊手好閒的石頭成 at 2006年06月26日 21:05
我不是數學家,
不過我想邏輯系統是二進位系統,而傳統數學為十進位系統。
數學發展至今一直都是以十進位為架構而衍生出來的,包括所謂的微積分、指數、對數等等。
如果真要將現行的所有運算轉為邏輯運算似乎也不是不可能,只是人類可能要以二進位系統重新建立一套新的理論架構,這似乎是一件浩大的工程,而且也沒有必要作這樣的事情。現有的技術都可以直接做轉換了,即使發展這樣的系統應該也沒有它的市場價值!
而那些人無法解析回去,我想大概是因為他們本身具備的思維是以十進位系統為基礎,若要求他們嘗試以二進位系統去思考應該是一件蠻困難的事吧!
Posted by JSC at 2007年04月11日 12:22
數學並不是只有算術(一般的微積分多是算術的延伸),數學還有集合論、群論、拓樸學、序理論、公理化系統、歐氏幾何、數學邏輯、範疇論、圖論、證明論……
數論只是其中一個分支而已,就算是邏輯學也不一定是古典的一階邏輯,還可以是真觀邏輯(Intuitionistic logic)、模糊邏輯等等,而集合論邏輯亦已被證明大過一階邏輯,並不是全部集合論語句都可以轉換成一階邏輯語句。

十進制與二進制就是數論的研究範圍。

並不是所有十進制有限小數位小數都可以精確地轉換成機器能表示的二進制小數,因為有很大部份的十進制有限小數位小數都是對應到二進制無限小數位循環小數,何況是無理數等無限小數位小數?多數電腦計算和記錄的是一個近似值,明白這一點,即是對數學中的「嚴謹」有一點認識。

現代的電腦做不到的是發明和創造,即是包括建構式證明。因此電腦要計算微積分就要使用蒙地卡羅積分法、辛普遜積分法等等近似法作機械式重複計算。

值得注意的是,數學中的很多算術計算都是不分十進制、二進制或甚麼進制的。
Posted by LungZeno at 2007年11月14日 18:46
我們要把各種數學模型轉換成基礎算術的組合才可以讓電腦計算是因為現代電腦無法做到建構式運算和處理無限所致,而不是二進制十進制的分別,更不是因為電腦用位元邏輯來「思考」。
Posted by LungZeno at 2007年11月14日 19:00
『以前還有個數學研究所的人,問過我「超長整數」 (超過 unsigned long long 範圍的數) 相加的 C 語言程式怎麼寫。』
這只是他沒有想過用超過一個儲存單元來儲存數值、用字元串儲存數值和自行處理進位借位等問題吧了。
當然啦,懂一點組合語言的人都會懂得處理。
就算要精確處理有限小數位十進制小數亦可以如法炮製。
Posted by LungZeno at 2007年11月14日 19:38
十進制轉換成十六進制根本不用那麼麻煩,
基本上當你把數字"放到"記憶體時,
就已經自動幫你轉成二進制了,
而4位元的二進制剛好就是十六進制,
所以其實直接到記憶體上"拿資料"就好了,
根本就沒什麼在計算的。

至於超長整數的相加,
還是離不開數學啊!
想想平常怎麼計算兩數相加的,
例如:97+18=115
先計算個位數部分的7+8,
結果是15,
先把個位數的5記下來,
再來就把進位的1和這兩數十位數部分相加9+1+1,
結果是11,
再把後面的1記下來放在個位數的那個5前面,
而百位數部分因為沒有數字相加,
所以就直接把剛剛的進位記錄下去,
所以結果就是115,
而上面的個位數、十位數和百位數,
其實可以想像成電腦的記憶空間,
而用越多的記憶空間來存放的話,
就能記算出越多位數的"長整數"了,
而這樣還是離不開數學啊!
只不過是電腦幫你把這些給計算出來了而已。
Posted by yannan at 2009年04月1日 16:56
yannan在發言前應該先看把本文看完才是,才不會浪費時間打那麼多字。

本文例子說的是「10進位數字表示文字轉換成16進位數字表示文字」。也就是說把字串 "255" 顯示成字串 "FF"。

另外,關於超長整數的部份,你應該沒學過組合語言,不了解計算機的「進位機制」是有限制的,它的限制就是暫存器的位元數。
如果像你說的那麼簡單,我們現在也不會分 32bit作業系統、64bit作業系統。
Posted by 遊手好閒的石頭成 at 2009年04月10日 06:39
我想LungZeno講到重點了
電腦無法處理"無限"的問題,只能用逼近的
所以電腦很適合處理離散的問題,對於連續的問題只能算到近似
Posted by Flame at 2009年04月21日 03:41