2011年7月1日 星期五

ABC FORTH的新發展

曾慶潭2011-07-02於紐西蘭
Ching-Tang Tseng
ilikeforth@gmail.com
http://forthfortnight.blogspot.com

1. 前言

這可能又是一篇沒人愛看的文章了,其中卻蘊含了不少難以發展的技術,您愛不愛看就悉聽尊便,我不會很在乎,您若還想繼續讀下去,千萬別受我個人意念的影響,否則得不到好結果。
我的各種研究與發展,長久以來就不被重視,沒人理睬,更不可能得到任何支持,我早已習慣,處之泰然,唯一覺得欣慰的事情,就是發佈網文之後,還真有不少人來拜訪,全世界都有,但未必是因我的研究與發展而來。
事實上,我個人在ABC FORTH數學計算系統上的發展,已經與大眾漸行漸遠。當初為了顧及系統的實用性,曾將ABC FORTH系統發展之事,暫停了一段時日,改為努力地寫出一本能讓大眾接受的書本。結束寫書之長期工作後,我便再度開始大肆發展這個系統,第一件挑選的重任,就是實現我曾經在『玄數』網文中介紹過的技術,將超大整數的數學計算能力加進系統,實現了!耗時約兩星期,還有後續發展,準備再收集幾個超級大整數的特殊函數功能程式,將它們全加進系統。
這些新發展,與我已經寫成的書本不相關;這些新功能,也與一般大眾的使用需求不相關。我長期思考過這些問題,所以發展再難,也應該可以一一突破;我也做好心理上的準備,所以完成一項,就還會冒出新的一項。每個新發展,都需要讀不少書,也要研究許多先聖先賢設計出來的大型程式,全面融會貫通之後,才能組織出自己的東西。能有具體結果的發展,都不是輕鬆的工作,如果您親眼目睹我這個60歲的老頭,這麼老了還這樣子幹活,您適合在年輕時及時享樂而懈怠學習嗎?希望我的努力能夠成為年輕人的鼓勵。
首先,讓大家見一見超大整數數學計算系統的基本功能,以網文容量容得下,真實資料刊得出來為原則,利用將圓周率Pi(π,為打字便利計,本文一律簡稱Pi)算到2500位數的計算技術,展示程式與執行結果。
我對大數計算系統性能上的設計基本要求是:程式必須讓高中生也能讀懂,除了清楚還必須精確。清楚,就能讓大家容易利用這個系統來設計大數的數學計算應用程式,精確,才能作為大數問題的分析工具。
本文除了展示,免不了必須談一點理論根據與比較分析,這些內容可以告訴大家,新聞報導將Pi計算到五兆(5T digits)位數,只是技術不錯,卻並不是甚麼天大的突破,所以,技術值得鼓勵,卻值不上因此而應頒給實現者任何學術學位。使用FORTH程式語言,能夠輕而易舉的估算出計算這種問題的記憶體耗用量,我在發展出ABC FORTH系統的大數計算能力後,便有資格告訴大家,現行個人電腦的能力,大約就是能將Pi處理到達十兆位數,以後呢?以後再說。

2. 程式及其執行結果

\ 求Pi至2500位數的程式,以2501位整數來表示

INTEGER I
INTEGER KK

0 BIGVARIABLE X
0 BIGVARIABLE DD
0 BIGVARIABLE PI#1 2500 ALLOT
0 BIGVARIABLE W# 2500 ALLOT
0 BIGVARIABLE ATAN# 2500 ALLOT
0 BIGVARIABLE PI#2 2500 ALLOT

0 BIGVARIABLE BIG0
10 BIGVARIABLE BIG10

: RESET BASIC
10 LET B{ W# = BIG0 }B
20 LET B{ ATAN# = BIG0 }B
30 LET B{ DD = BIG0 }B
40 LET KK = 0
50 END
;

: SUBATAN BASIC
10 REM Subroutine ATAN(X), in fact, X=1/N
20 LET B{ DD = X * X }B
30 LET B{ W# = X }B
40 FOR I = 1 TO 2500
50 LET B{ W# = W# * BIG10 }B
60 NEXT I
70 LET B{ ATAN# = BIG0 }B
80 LET KK = 1
90 LET B{ W# = W# / DD }B
100 LET B{ ATAN# = ATAN# + ( W# / I>BIG ( KK ) ) }B
110 LET KK = KK + 2
120 LET B{ W# = W# / DD }B
130 LET B{ ATAN# = ATAN# - ( W# / I>BIG ( KK ) ) }B
140 LET KK = KK + 2
150 IF B{ W# <> BIG0 }B THEN -90
160 END
;

: PAI1 BASIC
10 LET B{ X = BIG0 }B
20 LET B{ PI#1 = BIG0 }B
30 RUN RESET
40 LET B{ X = I>BIG ( 5 ) }B
50 RUN SUBATAN
60 LET B{ PI#1 = PI#1 + ( I>BIG ( 16 ) * ATAN# ) }B
70 RUN RESET
80 LET B{ X = I>BIG ( 239 ) }B
90 RUN SUBATAN
100 LET B{ PI#1 = PI#1 - ( I>BIG ( 4 ) * ATAN# ) }B
110 RUN CR CR
120 PRINT " 2500 digits pi = : "
130 RUN PI#1 BIG.
140 END
;

: PAI2 BASIC
10 LET B{ X = BIG0 }B
20 LET B{ PI#2 = BIG0 }B
30 RUN RESET
40 LET B{ X = I>BIG ( 57 ) }B
50 RUN SUBATAN
60 LET B{ PI#2 = PI#2 + ( I>BIG ( 176 ) * ATAN# ) }B
70 RUN RESET
80 LET B{ X = I>BIG ( 239 ) }B
90 RUN SUBATAN
100 LET B{ PI#2 = PI#2 + ( I>BIG ( 28 ) * ATAN# ) }B
110 RUN RESET
120 LET B{ X = I>BIG ( 682 ) }B
130 RUN SUBATAN
140 LET B{ PI#2 = PI#2 - ( I>BIG ( 48 ) * ATAN# ) }B
150 RUN RESET
160 LET B{ X = I>BIG ( 12943 ) }B
170 RUN SUBATAN
180 LET B{ PI#2 = PI#2 + ( I>BIG ( 96 ) * ATAN# ) }B
190 RUN CR CR
200 PRINT " 2500 digits pi = : "
210 RUN PI#2 BIG.
220 END
;

ok

PAI1

2500 digits pi = :
2501 digits
31415926535897932384626433832795028841971693993751
05820974944592307816406286208998628034825342117067
98214808651328230664709384460955058223172535940812
84811174502841027019385211055596446229489549303819
64428810975665933446128475648233786783165271201909
14564856692346034861045432664821339360726024914127
37245870066063155881748815209209628292540917153643
67892590360011330530548820466521384146951941511609
43305727036575959195309218611738193261179310511854
80744623799627495673518857527248912279381830119491
29833673362440656643086021394946395224737190702179
86094370277053921717629317675238467481846766940513
20005681271452635608277857713427577896091736371787
21468440901224953430146549585371050792279689258923
54201995611212902196086403441815981362977477130996
05187072113499999983729780499510597317328160963185
95024459455346908302642522308253344685035261931188
17101000313783875288658753320838142061717766914730
35982534904287554687311595628638823537875937519577
81857780532171226806613001927876611195909216420198
93809525720106548586327886593615338182796823030195
20353018529689957736225994138912497217752834791315
15574857242454150695950829533116861727855889075098
38175463746493931925506040092770167113900984882401
28583616035637076601047101819429555961989467678374
49448255379774726847104047534646208046684259069491
29331367702898915210475216205696602405803815019351
12533824300355876402474964732639141992726042699227
96782354781636009341721641219924586315030286182974
55570674983850549458858692699569092721079750930295
53211653449872027559602364806654991198818347977535
66369807426542527862551818417574672890977772793800
08164706001614524919217321721477235014144197356854
81613611573525521334757418494684385233239073941433
34547762416862518983569485562099219222184272550254
25688767179049460165346680498862723279178608578438
38279679766814541009538837863609506800642251252051
17392984896084128488626945604241965285022210661186
30674427862203919494504712371378696095636437191728
74677646575739624138908658326459958133904780275900
99465764078951269468398352595709825822620522489407
72671947826848260147699090264013639443745530506820
34962524517493996514314298091906592509372216964615
15709858387410597885959772975498930161753928468138
26868386894277415599185592524595395943104997252468
08459872736446958486538367362226260991246080512438
84390451244136549762780797715691435997700129616089
44169486855584840635342207222582848864815845602850
60168427394522674676788952521385225499546667278239
86456596116354886230577456498035593634568174324095
2 ok


PAI2


2500 digits pi = :
2501 digits
31415926535897932384626433832795028841971693993751
05820974944592307816406286208998628034825342117067
98214808651328230664709384460955058223172535940812
84811174502841027019385211055596446229489549303819
64428810975665933446128475648233786783165271201909
14564856692346034861045432664821339360726024914127
37245870066063155881748815209209628292540917153643
67892590360011330530548820466521384146951941511609
43305727036575959195309218611738193261179310511854
80744623799627495673518857527248912279381830119491
29833673362440656643086021394946395224737190702179
86094370277053921717629317675238467481846766940513
20005681271452635608277857713427577896091736371787
21468440901224953430146549585371050792279689258923
54201995611212902196086403441815981362977477130996
05187072113499999983729780499510597317328160963185
95024459455346908302642522308253344685035261931188
17101000313783875288658753320838142061717766914730
35982534904287554687311595628638823537875937519577
81857780532171226806613001927876611195909216420198
93809525720106548586327886593615338182796823030195
20353018529689957736225994138912497217752834791315
15574857242454150695950829533116861727855889075098
38175463746493931925506040092770167113900984882401
28583616035637076601047101819429555961989467678374
49448255379774726847104047534646208046684259069491
29331367702898915210475216205696602405803815019351
12533824300355876402474964732639141992726042699227
96782354781636009341721641219924586315030286182974
55570674983850549458858692699569092721079750930295
53211653449872027559602364806654991198818347977535
66369807426542527862551818417574672890977772793800
08164706001614524919217321721477235014144197356854
81613611573525521334757418494684385233239073941433
34547762416862518983569485562099219222184272550254
25688767179049460165346680498862723279178608578438
38279679766814541009538837863609506800642251252051
17392984896084128488626945604241965285022210661186
30674427862203919494504712371378696095636437191728
74677646575739624138908658326459958133904780275900
99465764078951269468398352595709825822620522489407
72671947826848260147699090264013639443745530506820
34962524517493996514314298091906592509372216964615
15709858387410597885959772975498930161753928468138
26868386894277415599185592524595395943104997252468
08459872736446958486538367362226260991246080512438
84390451244136549762780797715691435997700129616089
44169486855584840635342207222582848864815845602850
60168427394522674676788952521385225499546667278239
86456596116354886230577456498035593634568174324130
4 ok



上列程式中包括了兩個同樣可以求得Pi 的設計,PAI1為根據標準論文發佈的式子計算而得。PAI2引用的式子,則為網路上德國人曾經公開過的設計,號稱也能獲得同樣的結果。經上列二程式執行、測試後的結果發現,當計算到2500位數時,兩者僅最後四位數有所不同,PAI1為4,0952而PAI2為4,1304,經與uBASIC執行後的結果比較,有更多的5位數不同。因此,這種尾部幾位數的誤差,純粹起因於電腦執行多次數字計算,最後引致的捨位誤差(Round off error),調整上列設定為2510位數後,可得正確的結果應為4,1125.............。
目前,我將ABC FORTH數學計算系統設定成最大輸出為10008位數,要增加位數,更改相關設定便能辦到。我用別人廢棄的電腦來設計系統,Pentium II 0.266GHz的CPU,執行出一萬位數,耗時約五分鐘。夠了,再多的位數,不是我的目的所在,所以不去浪費時間提升位數。
我用我自己設計的大數計算系統,把求解Pi到幾位數的計算原理澈底搞清楚,是實際執行後的了解。也把現行系統能夠處理Pi到幾位數的極限能力澈底搞清楚,也是實際設計出程式後的了解。為什麼選2500位數刊入網文?因為它是uBASIC系統的最高上限能力,2500位數就能夠拿來進行有根據的實際比較。現行的套裝軟體Maple或Mathematica也都能獲得比較數據,但是它們很貴,我買不起,它們也不提供像我這樣的源程式,只能得到不知所云、沒有意義的答案,無補於增進知識或技術,我一直當它們是腐化人心的套裝軟體,全國只須買一套來進行數據比對就夠了。
別的程式語言,早就能計算Pi到許多位數了,傳統的FORTH程式語言也行,網文上可以輕鬆得到許多這方面的資料。但是,說實在的,一般程式都很難讀懂或比對,因為程式與實際的數學表示式相去太遠,除了BASIC或FORTRAN式的數學專用程式語言外,大概都是如此。所以我才設計ABC FORTH數學計算系統的大數計算能力。實現了設計,需要夠份量的測試程式,求解Pi到許多位數的問題,就是最佳範例。

3. 理論依據

如果您最近光顧過FORTH程式語言發明人─ Charles H. Moore先生的個人網頁,您會發現他也留了一篇新近討論Pi的簡短網文,標題是『Thoughts about Pi』。他當寫詩一般的方式寫這篇短文,還有哲學推理般的結論,他說:根據推論,一個四度空間內的超級球形體,圓球面積應為直徑d的3次方乘以Pi。(關於這項哲理,我們改在本文文末的附註內,另行討論)
我用會講話的程式語言ABC FORTH系統,讀Charles H. Moore先生網頁中他所留下來的愛詩,韻味十足,還刻意去調整詩中押韻部份的腔調,簡直就像是一種特殊的享受。分享他的喜好之外,也响應他的討論,本文就討論Pi,用的也全是他留下來的技術所設計出來的ABC FORTH數學計算系統。他網文中也提到,最近有人將Pi算到兆(A Trillion)位數,還建議了可參考之『Pi計算技術』的網頁。我因很久以前便已見過許多這種網頁,雖未再度按址前往一覽究竟,但對計算Pi的技術,已有一點認識。
能寫這篇網文之前,缺乏的就是實際使用程式進行各種快速的測試。以前雖寫過許多次這種程式了,但都因為發展困難,程式寫成,得到結果之後,便作罷了,不敢再度多寫另外的程式。這一次,我設計出了極為方便的系統,可以用來快速設計出相關程式,以便深入了解問題,現在,就培養出了許多的認識。
計算Pi的最原始根據,可以是只需要一個非常簡單的數學式子:

π = 16 * ATAN ( 1 / 5 ) – 4 * ATAN ( 1 / 239 ) ........(1)

以及ATAN(X)的冪級數展開式(Power series expansion)

ATAN ( X ) = X – X ^ 3 / 3 + X ^ 5 / 5 – ........(2)

現在,我深刻的了解到,如果能夠設計出一個具有大整數計算能力的系統,使用上述最原始的計算依據就夠了,並不需要其它的理論式子。後來被發現出來的許多可用計算式子,是為了讓計算過程,能因收斂較快而得到結果,才被提出來的,在位數的精確度上,並沒有另外實質上的貢獻。換句話說,不管您用那一套數學式子來計算許多位數的Pi,都能算得出來,差別只在算得結果的快慢而已。
因為,上列的(1)與(2)式,都是恆等式,不是近似式,恆等式代表理論上絕對相等,只要您有本事一路精確的計算下去,計算結果就絕對正確,執行PAI1的程式,用的就是(1)與(2)式,PAI2則使用(2)式與下列的(3)式。

π = 176 * ATAN ( 1 / 57 ) + 28 * ATAN ( 1 / 239 ) – 48 * ATAN ( 1 / 682 ) + 96 * ATAN ( 1 / 12943 ) ........(3)

那麼,本文實在沒有必要再寬列各種其它的計算式子了,甚至於最近算出五兆位數Pi者,所依據的數學式子,也沒有必要去探尋。因為,如果我將大數計算系統設計得很好,再大的數字都能計算,給我一個十兆(10的14次方)位數的數字,送得進系統,就使用本文設計出來的程式,也一樣能得到十兆位數的Pi。不過,若僅用上述程式處理這樣的問題,單將10自乘十兆次以得到十兆位數的超級大整數,就已經是一個相當驚人的乘法計算量了,隨後還得進行更多的計算,因此,不是輕鬆的計算。
我所設計出來的大數計算系統,並沒有計算位數的上限,現行的上限只受限於硬體,指的是FORTH系統以上所有未被用到的記憶體容量,全部都能用來放置計算之值。算法中只需設計三個位數容量相同的大數,而每8個位元組(Bytes)能表示大約21億以上,也就是大約10位數。FORTH系統的選址能力可以到達多少空間?計算過程就能存取到相同的程度。那麼十兆位數就需要三十兆乘以0.8的位元組量,能裝24T Bytes的記憶體,執行64位元為一單元選址能力的FORTH系統就能辦到。FORTH是能將類似硬碟之大批儲存媒體的實體記憶體,納入選址範圍的程式語言,這樣的FORTH系統可以設計得出來。我設計的ABC FORTH系統,全用FORTH高階指令設計,可隨基礎FORTH系統而轉殖,上列程式也就能繼續被執行。
系統的選址能力而不是計算能力,成了解決這個問題的絕對關鍵。這也就是為什麼能算五兆位數Pi的人,沒有能夠得到學術地位的原因了。以學術方式,首先提出(1)或(3)式的人,才能獲得學術名聲,還有許多人提出過各種冪級數來算Pi,都寫成了論文,並證明提出的式子是一個恆等式,學術界以這種方式接受研究結果,也很合情合理,重點就在『恆等』而不僅只是『幾位數』。
本文列出了實際程式與理論依據的數學式子,兩者間的對應,是直接的關係,不太需要解釋。計算Pi到小數點後面幾位數的問題,必須使用固定點算術來計算,而不可以使用浮點算術,因為浮點數表示的數字,離小數點愈遠的位數,就有愈多的棄用數字(De-normal number),它的不精確數字表示方式,算不出精確的Pi。固定點數字還必須當作放大了等同位數的大整數來處理,才能得到運算後的正確絕對值,因此,設計程式時,想算幾位數?就得先行將那麼大的一個超級大整數先行準備好。例如:我們想算2500位數,就得準備一個2500位數的大整數,它代表一個10的2500次方的超大數字,再以它為根據來進行ATAN函數的計算,算得出來,就能得到正確的結果。
上述程式,ATAN的累積演算結果,就存放在ATAN#內,演算過程中的暫存數字,放在W#中,要計算冪級數多少項?才會令暫存數字W#內已無數可算,是一個算了才知道結果的問題,因此,把W#算到0了,就表示計算位數到達了設定的位數了。算得的ATAN再經過(1)或(3)式的逐項累積計算,就能存進PAI1或PAI2,就能得到最終結果。
隨著系統的不同,將W#算到0的計算次數會有所不同,我的系統統計數字如下:

1/N........KK
5........3581
239......1057
57.......1429
682......885
12943....613

換句話說,如果1/N=5,程式便計算了( 3581 - 1 ) / 2 = 1790項,才讓W# 等於0,也就是算到了 X^3851 / 3851這一項,W#的內容才消失成0。
解釋到這裡,讀者應該明白,我們已經有了(1)式,為什麼還去發展出(3)式來的原因了。因為

(1)式要計算:

( 3851 - 1 + 1057 -1 ) / 2 = 2453(次)

(3)式要計算:

( 1429 - 1 + 1057 -1 + 885 - 1 + 613 - 1 ) / 2 = 1990(次)

如果要求位數愈多,計算次數的差別就會愈來愈大,所以不要小看從德國人那裡得來的資料,(3)式有它存在的價值。
還有,演算過程中使用了大量的除法,除到最後,免不了會有除不盡的捨位問題,計算次數愈多,捨位的可能次數就愈多,結果就造成了2500位數最後的幾位數不夠精確的問題。PAI1與PAI2的計算結果都有173與179的誤差,是算了幾千次累積出來的結果。uBASIC的誤差則為17013,uBASIC內的計算方式不得而知,顯然計算次數至少也是幾萬次,否則不會累積出這麼大的誤差。
耗用記憶體與執行速度,均非現行電腦程式設計上必須嚴格考慮的問題,因此,我在設計程式時,2500位數就直接宣告2500 ALLOT,要求系統控留出2500個位元組(Bytes)的記憶體空間來,不去考慮可以乘以0.8以節省記憶體用量的問題。要等幾分鐘才能得到一萬位數的答案,大概是我個人可以容忍的時間耗用量,因此,我也把系統處理位數的設定,暫時固定在一萬位數,系統內就固定規劃了10008個位元組的印出數字緩衝區,不過,這些規矩純粹只是我的個人喜好設定,可以隨時修改。

4. 討論

上述簡單的說明,都只是針對求Pi到幾位數的問題而進行實測後的敘述,若非基於簡明的程式與輕易的操作性能,想體會出這些結果,並不容易。指令SUBATAN中,在150列後面新插入一列

155 PRINT KK

重新載入程式再執行,您就可以得到第3節中的分析數據。調整新的設定數據,也是輕而易舉、簡單、明白。這是我設計出這個大數計算系統的基本目標。
我還有後續工作必須進行,就是為這樣的系統添加可有的常用函數,例如:大數的整數方次,或大數的開平方,其它類似一般整數運算所需要的函數已經建好了。待函數建立齊全之後,就能落定ABC FORTH數學計算系統的大數計算全套功能,算是系統性能的一大躍升。
發展這個系統最大的難題,不在數學計算自身,因為源程式是先聖先賢的創作,為了完成我自己的要求,源程式不得不進行大肆修改,發展時,主要的困難出現在如何安排出恰當的大數輸入、輸出指令。
上列程式中尚未顯示輸入功能,只顯示了一個名為I>BIG的小整數轉換成大整數的指令。我下了很大的功夫,以自己設計的ABC FORTH系統追蹤出一些問題,發現如果僅藉助於S”………”標準指令來安排大數的輸入,系統文字輸入緩衝區,規劃了最多只能為260個字數的限量,限制了輸入大數的可用數字量。直接輸入的數字,如果超過限制量,便無法正確轉換。因此,必須另行設計新的指令或新的格式來解決問題。大數的後面,必須配合另一個名為S>BIG的指令,它可以根據任意指定位址作為起始位址,轉換出該位址以後任意位數的數字。目前,僅暫時使用S”………”標準指令設計一般程式。
如果您嫌直接將大數寫在程式內太麻煩,而想把一個超大數字明明白白的儲存在純文字檔案中,例如就儲存了10K Bytes大約為一萬位數的數字,想要轉換進我的大數計算系統,一點問題都沒有,依靠S>BIG指令就能完成。轉換的位數沒有上限,我估計,只要您單憑打字打得出來的數字,它都能辦得到。上列程式顯示了BIG.(Big dot,大數拓印)為數字的輸出指令,它的輸出上限,基本上暫定為10008位數,是為了避免輸出您我都看不完的位數而故意設定的,它也可以沒有上限。
幾個典型的測試程式,就如下列,它們都是執行無誤的標準程式。

\ 大數測試程式

INTEGER I

0 BIGVARIABLE A1 2504 ALLOT
0 BIGVARIABLE B1 100 ALLOT
0 BIGVARIABLE C1 100 ALLOT

10 BIGVARIABLE BIG10
0 BIGVARIABLE DD

: TEST01 BASIC
10 LET B{ A1 = S" 12,3456,7890,1234,5678,9012,3456,7890 " S>BIG }B
20 LET B{ B1 = S" 98,7654,3210,9876,5432,1098,7654,3210 " S>BIG }B
30 LET B{ C1 = A1 + B1 }B
40 RUN CR
50 PRINT " C1=A1+B1 and C1 = : "
60 RUN C1 BIG.
70 RUN CR CR
80 END
;

: TEST02
B{{ A1 = S" 3 " S>BIG }}B
B{{ B1 = S" 5 " S>BIG }}B
B{{ C1 = A1 * B1 }}B
CR ." A1=3 , B1=5 , C1=A1*B1 , and C1 = : "
C1 BIG.
;

: TEST03 BASIC
10 LET B{ A1 = BIG0 }B
20 IF B{ A1 = BIG0 }B THEN 60
30 PRINT " A1<>0 "
40 GOTO 999
60 PRINT " A1=0 "
999 END
;

: TEST04 BASIC
10 FOR I = 1 TO 10
20 LET B{ DD = BIG0 + I>BIG ( I ) }B
30 RUN DD BIG.
40 NEXT I
50 END
;

系統還有其它許多功能,舉例而言,本文列示的程式,實際上不單只是求Pi到幾位數的功能而已,別忘了,程式中設計了ATAN函數,它就代表一個非常標準,能將ATAN函數精確值求到非常多位數的程式。凡是可以寫成冪級數方式表示的任何函數,都可以依照本文中設計的基本方式設計出來,這種函數有無限多個。
我曾經參與fig總會科學程式庫中一個公益程式的審核工作,程式希望將特殊函數之值,精確的計算到小數點後面十幾位數,該函數也能用冪級數展開式表示。那時,專注於原作者建議的多精度浮點計算系統的運用,自己尚未發展這一套大整數計算,所以是糊里糊塗的接受別人提供,以C程式語言寫成的的多精度浮點功能,根本不知道計算結果到底精不精確?或絕對精確到幾位數?現在自己設計出了這個大數計算系統,再度從事那樣的工作時,會有最好的比較依據了。
大整數計算的精確度,是可以辦得到絕對精確的,多精度浮點數系統則辦不到,這是兩者最大的差別所在。
多年以前,我就曾經在eForth系統上設計過固定點數字計算系統,也實現了全套必要基本函數的設計,有過充足的設計經驗。現在,我如果還想硬幹,再設計一套小數點後面有一千位數精確度,小數點以上也有一千位數大數容納能力的固定點數字計算系統,絕非難事。那些斤斤計較於小數點後面十幾位數還算不準的浮點計算問題,相形之下,就根本算不了什麼了。從執行這個算出2500位數Pi值的程式顯示,我的舊電腦所須耗用的時間,還在我可以容忍的範圍之內,因此,必要時,我會用這樣的固定點計算系統,去解釋別人的浮點計算結果精不精確?
大學裡教我數值分析課程的王九龍老師,教過我們,二的一百次方(2^100)在程式中要改寫成下式:

(((((2^2)^2)^5)^5)

系統才會算得更準,為什麼?
如果您手頭有科學用小型計算器,直接算算看,我所得到的答案如下:

2^100 = 1.267650599E30
(((((2^2)^2)^5)^5) = 1.2676506E30

兩個答案確實有一點不一樣,那一個比較準?據說是後面算出來的這一個。現在,我有了我自己設計出來的大數計算系統,何不自己驗證?

\ 精算2的100次方

INTEGER I
0 BIGVARIABLE A1
1 BIGVARIABLE BIG1
2 BIGVARIABLE BIG2

: 2^100 BASIC
10 LET B{ A1 = BIG1 }B
20 FOR I = 1 TO 100
30 LET B{ A1 = A1 * BIG2 }B
40 NEXT I
50 RUN CR CR
60 PRINT " A1=: "
70 RUN A1 BIG.
80 END
;

執行2^100後顯示:

A1=:
31 digits
1267650600228229401496703205376 ok

我的系統可以明確的告訴您,那一個才比較準了,確實是後面那一個。不僅如此,我還能驗證系統內軟體或硬體的精確度,到達什麼程度?如果您勤快一點,就分別去開啟任何具有浮點數功能的FORTH系統,例如:Win32Forth的前後兩種版本V4.2與V6.14,然後執行下列指令

30 SIGDIGITS !
2E0 100E0 F** FE.

您將得到浮點系統告訴您之2的100次方的答案,它們都來自於硬體的數學處理器(Co-processor),再經軟體設計的輸出指令告訴您結果,V6.14版使用的是8 Bytes/Float,而V4.2版使用的是10 Bytes/Float,實際輸出結果如下:

V6.14版:1.26765060022822944000000000000 E30
V4.2版: 1.26765060022822940000000000000 E30
絕對值 1267650600228229401496703205376

您請自己看看上面列示的評鑑結果,不管您未來是幾位元的系統,或者是您很自以為是的使用現成邏輯閘(Logic gate),燒製出了一顆能算出許多位元的數學處理器(Co-processor),我現在就準備好了工具,能用來明確說出系統計算數字後的絕對精確程度。
我也曾經公佈過將階乘( Factorial, ! )計算到一億階乘(100000000 !)的網文,用的是浮點數計算方式。現在,可以用大整數來算出非常大的精確答案了,這些指出來的功能,都能讓許多高等數學教科書的內容進行改寫。我不是數學家,但我設計出了研究這種問題所需要的最佳工具系統。
完成的發展證明了我在『玄數』網文中的數字資料格式觀念是正確的,所以設計程式時,才能腦筋清楚的進行規劃。同樣的模式,可以運用在基因圖譜的運算系統發展上了。生物學我尚外行,基因圖譜該如何運算?得再讀不少書才能了解。但我知道,世上還沒有能用BASIC程式語言來設計基因圖譜比對運算程式的系統。我想設計一個輸入900個AGTC基因圖譜後,能自動到圖譜資料庫中,比對出資料的系統來。或者是進行兩套基因圖譜的比較後,獲得有百分之幾相同的數據。甚至於生物學家能夠告訴我的運算需求,我應該都設計得出來。
我的研究發展確實是離一般群眾愈來愈遠,所以這些網文的讀者也會愈來愈少,但不管怎麼說,這些技術都還是一些有用的東西,已經寫出來公佈了,就放著吧。表面上,我的生活習慣看起來似乎很窮,使用32位元老掉牙的電腦發展系統,太落後了。大家都期盼著64位元的裝備普及起來,就有64位元的FORTH系統可用了,也許64位元的裝備確實能夠提供許多難以想像的電腦性能,但就數學計算而言,今天我所完成的ABC FORTH系統大數計算功能,已經突破了不僅只是64位元的整數範圍而已,沒有上限!而且可以『永遠』沒有上限!

5. 附註:Pi的哲學

四度空間中的超級球形體,其圓球面積推測應為直徑d的三次方乘以Pi。為什麼?直徑d的因次是長度,因此,這樣的描述就形同是:『球形體之面積上的體積是π*d^3』。哲學意味這麼濃厚的『面積上的體積』到底指的是什麼東西?這一篇附註,就來簡談這一項哲學問題。
據說,哲學家蘇格拉底經常忍不住,想到大街上高談闊論他的哲學,每次出門時,他太太都氣得從二樓倒他一盆冷水,希望他腦袋清醒一點,不要成天不務正業,不顧家庭。因此,如果我打網文要涉及哲學時,也會看一看我太太的臉色,還好,她知道我有痛風的老毛病,只會強迫我按時喝水,不是往我頭上倒水。
想說明哲理,就得強調需要很好的表達能力,否則就會胡說八道;自己也必須透徹了解談論的主題,否則隨後自己也會不知所云。對一般人而言,四度空間是一種形而上的東西,難以表達也難以理解。我在近代物理學中,學過愛因斯坦的相對論,開頭第一章就是四度空間的問題,所以能夠解釋這種形而上的物理現象。
想把Charles H. Moore先生推測出來的四度空間球形體之面積計算方法搞清楚,就不得不從四度空間的觀念來探討問題。我們生活的這個世界,並不容易找到足供描述此一物理現象的模型或模式,來進行比擬式的解釋,難怪一般人就不容易了解四度空間的問題。
我小的時候想過這個問題,腦海中也有一幅連貫的推理圖形,在學過相對論後才具體的成形,這樣的推論模式,便作為自己終身對四度空間問題的解釋工具。我先將說明圖示列示此處,再來解釋四度空間內的物理量,是如何計算出來的?然後對應到四度空間的球形物,大家就能夠明白,Charles H. Moore先生為什麼能夠推測出那種圓球面積是Pi乘上直徑d的3次方了。
圖一、各維度空間中『方形物』的物理量

三度空間中的圖形有點、線、面、體,這是大家都熟悉的物理量表示方式,線對應到長度,面對應到面積,體對應到體積。四度空間內,我們必須增加一個維度的考慮量,以實例來解釋,例如:除了長寬高外,時間可以是第四個維度,或相對速度接近光速的另一個環境,那種相對速度環境就得表示成第四個維度,才能表示原來三度空間中的長寬高。
圖一中的XYZ分別代表的就是長寬高,T就代表時間維度,相對速度接近光速的環境,就會使第四維度表示的時間維度隨之而變。相對論告訴我們,第四維度不同時,原來三度空間內的長寬高就會縮短或變長,或者就說成時間的長短有所不同。
那麼,圖一最右邊的一個稱為『方泡』的圖示,就是用來表示這種物理現象用的。圖示中有兩個方形體,一大一小,小的方形體方方正正的被包在大的方形體中,它是表示對應於第四維度的兩個座標點處,應該顯示的方形體樣式。例如:相對運動速度較慢的方形體,它的尺寸應該是比較大的這一個方形體,一旦相對運動速度接近光速,長寬高都會縮短,方形體的尺寸就應該是比較小的那一個。
透過這樣的實際圖形解釋,大家就容易體會出那個眼不能見的第四個時間維度了,簡述它的效果,就是會使長寬高脹或縮,如此而已。
接下來,我們來計算這些東西的物理量,然後,才能根據前後連貫的推理去解釋Charles H. Moore先生推測的超級球面公式。根據這樣的圖示,我們也才能依樣畫葫蘆的繪出超級球形體,在四度空間內的球面應該如何表示?並對應到計算公式。
點沒有物理量,就只是一個點,我們必須以數字單位元素中的1來代表,什麼東西都沒有才是0。線是長度,我在圖示中故意稱它為方線,以便有別於圓周線,方線的長度是1乘上X。面是面積,我故意稱它是方面,它的面積是1乘上長度X再乘上寬度Y。體就是體積,我故意稱它是方體,它的體積是1乘上長度X再乘上寬度Y再乘上高度Z。依次類推,四度空間的方形物,我賦予它名稱,叫作『方泡』,為什麼這樣命名?等一下再解釋。它的『泡積』就應該是1乘上X再乘上Y再乘上Z再乘上T。繼續擴大上去,五度空間就在那裡,太不容易表示了,所以我打了一個問號『?』。再往圖一中的最左邊看,那裡還有負維度的空間表示圖示,我們暫時沒有興趣,所以不再討論。
現在可以展示各維度空間中的球形物之面積,應如何表示?的圖示了。如圖二所示:
圖二、『球形物』之面積

我們再度依序推理,以便獲得合理的面積計算公式。圓點是沒有面積的,但它應該與前述的方點有所不同,所以,它的起始計量方式就不應該是1,而應該是1乘上Pi。圓點演變成了圓圈,它對應出來的長度稱為圓周,圓周長的計算公式是1乘上Pi再乘上d。繼續演變成3度空間的球形體時,球面的面積計算公式是1乘上Pi再乘上d再乘上d。那麼,在四度空間中表現出來的圓球形物,我賦予它名稱『圓泡』,『圓泡積』就是Charles H. Moore先生所稱的四度空間內超級球形體的面積,按上述推理,當然應該就是1乘上Pi再乘上d再乘上d再乘上d。
現在,大家明白整件事情從頭到尾的類比推理過程了吧?這就是一種哲學上推論的方式,我們還能推下去:

五度空間內的更超級球面積是1*Pi*d^4。
N度空間內的非常超級球面積是1*Pi*d^(N-1)。

Charles H. Moore先生是我們大家的FORTH老師,我們都是他的學生。
1200多年前,唐朝文學家韓愈(西元768~824年)河南河陽縣(今孟縣)人,曾任官至吏部侍郎(吏部掌管全國官吏人事,首長稱尚書,下設左、右侍郎),在『師說』一文中有句名言:『師者,所以傳道、授業、解惑也。』。
我則延伸韓愈的名言,跟著說:『生者,所以道傳、業受、惑解也。』

最後,解釋一下我為什麼採用『方泡』、『圓泡』來命名?
如果您有機會跌落到太平洋裡面的馬里亞納海溝(Mariana Trench)最深的溝底,深度約11000公尺(沒有人能夠量得絕對準確,想號稱最準,我也未必相信。因為沒有人能讓他的測量值可以一再重覆,就違反嚴謹的科學定義。堅持只測了一次的數據,還號稱最準,就叫作吹牛,有不少人喜歡幹這種事情,僅測一次的結果,通常僅具參考價值,非絕對值,Wiki百科上刊了一大堆,千萬不要隨便引用,引用了就成笑話,本文此處就暫時使用11000公尺解釋問題,沒有甚麼不好),然後從那裡放出一個氣泡(非常困難,等同於大約有一萬一千公斤以上的海水壓力,壓著您放不出氣泡),這個氣泡就會一直往上竄升到海面上來,氣泡會不斷地因為海水壓力的降低而愈變愈大,它整個變化的過程,就形同是四度空間內的球形物;它的面積連續變化的過程,就像是面積連續變化累積成了體積,學術上的形容,就是具有厚度的面積,厚度還跟它最後浮上水面時的直徑d直接相關。您現在知道我為什麼採用『方泡』、『圓泡』作為名稱的原因了吧?這種面積就叫作『泡積』。

沒有留言: