高級數學函數
曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 October 2026
本文記錄高級數學函數在ABC FORTH數學計算系統中的發展方法、設計格式、以及一些相關問題的探討,是一篇實用教材。ABC FORTH數學計算系統讓這類問題容易研究發展,也容易實際應用。
相對於高級數學函數者,則被稱作『一般數學函數』。在『ABC FORTH數學計算系統使用說明』第17頁中,提及一項重要觀念,它是設計出這個系統所依據的基本原理。數學式子內,除了數字、括弧、四則運算外、其他符號全被視同為一般數學函數來處理,包括等號『=』亦然,sine與cosine則是大家耳熟能詳的最典型一般數學函數。既然根據這樣的原理,才容易設計出這個系統,繼續延伸應用同一原理,就能大量擴充系統的功能。換句話說,此後所有發展出來的高級數學函數,只要設計格式與系統規格要求一致,就都可以輕而易舉的納入ABC FORTH數學計算系統,而成為系統的一個函數。因此,系統的發展是無限的,完全符合FORTH的基本哲理。
函數是用來描述變數間關係的數學表示式(Function is a mathematical expression describing the relation between variables.)。數學計算系統必須提供直接使用函數的功能,才能方便的設計程式,函數的數量卻是無限的。因此,除了一般數學函數以外的所有函數,都可以稱之為高級數學函數,ABC FORTH數學計算系統則根基本Forth系統建立了一般數學函數的功能。
現行個人電腦中,一般數學函數的計算,都是由具有浮點功能的數學處理器(Coprocessor)硬體元件協助完成的,硬體不能造的太大,所以功能就有所限制,通常均以提供一般數學函數為主,ABC FORTH數學計算系統的原始功能也僅限於此。近代與將來的電腦,則會根據使用需求,設計出許多具有高級數學函數功能的硬體元件,例如:為影像處理或高速信號處理的需要,而增加之特別函數功能加速處理器(Accelerator boards),增添的功能也只能設計出多少就加多少,永遠都還是有無限多的高級數學函數,不能以硬體實現其功能。ABC FORTH數學計算系統具備了健全的系統規劃,可以直接了當的添加任何新增硬體功能,因此,我們不討論如何增加硬體性的高級數學函數問題,只討論軟體性的程式設計技術,這些技術永遠需要,永遠有效。
適合以電腦處理的高級數學函數,是工程或研究方面需要使用、不易人工手解、需要大量數學計算的函數,它們需要電腦協助,電腦才予以協助,並不是所有高級數學函數,都需要設計程式實現功能,有些函數可以直接手解得到答案,不須藉助於電腦。本文僅舉一個不太可能會被考慮使用硬體實現其功能,卻又非得使用電腦計算不可的高級數學函數,當作程式設計範例,它被稱為指數積分函數(Exponential integral function),型式如下:
y=∫(exp(-x)/x)dx 積分的範圍從任意x值到無限大
與此高級數學函數相類似,且在工程應用與科學研究方面,普及性需求相當高的高級數學函數有許多種,而且在電腦中被處理的方式也完全相近,例如:
(1) gamma function
(2) Bessel function
(3) Cosine and sine integrals
(4) Fresnel integrals
(5) Legendre polynomial
(6) confluent hyper-geometric function
(7) hyper-geometric functions
(8) Hermite polynomial
(9) Laguerre polynomial
(10)Chebyshev polynomial
以指數積分函數當作基礎,透過觸類旁通的方式,利用ABC FORTH數學計算系統的便利操作性能,可以迅速設計出這些高級數學函數的功能程式。因此,ABC FORTH系統除了可以協助使用者更為深入的了解這些函數,或核驗這些程式的品質及準確性外,還可以進一步提供有興趣的人,以ABC FORTH系統設計出更新、更好、更可靠的實用程式。
Fig總會網頁的科學庫存程式(Forth Scientific Library Algorithm)中,第一個可以自由下載的純FORTH程式,就是指數積分高級數學函數,它具有高級數學函數的全面代表性,我們把原程式轉置此處,再仔細討論與比較。
\ expint Real Exponential Integral ACM Algorithm #20
\ Forth Scientific Library Algorithm #1
\ Evaluates the Real Exponential Integral,
\ E1(x) = - Ei(-x) = int_x^\infty exp^{-u}/u du for x > 0
\ using a rational approximation
\ This code conforms with ANS requiring:
\ 1. The Floating-Point word set
\ 2. The immediate word '%' which takes the next token
\ and converts it to a floating-point literal
\
\ Collected Algorithms from ACM, Volume 1 Algorithms 1-220,
\ 1980; Association for Computing Machinery Inc., New York,
\ ISBN 0-89791-017-6
\ (c) Copyright 1994 Everett F. Carter. Permission is granted by the
\ author to use this software for any application provided the
\ copyright notice is preserved.
CR .( EXPINT V1.1 21 September 1994 EFC )
: expint ( --, f: x -- expint[x] )
FDUP
% 1.0 F< IF
FDUP % 0.00107857 F* % 0.00976004 F-
FOVER F*
% 0.05519968 F+
FOVER F*
% 0.24991055 F-
FOVER F*
% 0.99999193 F+
FOVER F*
% 0.57721566 F-
FSWAP FLN F-
ELSE
FDUP % 8.5733287401 F+
FOVER F*
% 18.059016973 F+
FOVER F*
% 8.6347608925 F+
FOVER F*
% 0.2677737343 F+
FOVER
FDUP % 9.5733223454 F+
FOVER F*
% 25.6329561486 F+
FOVER F*
% 21.0996530827 F+
FOVER F*
% 3.9584969228 F+
FSWAP FDROP
F/
FOVER F/
FSWAP % -1.0 F* FEXP
F*
THEN
;
\ test code generates a small table of selected E1 values.
\ most comparison values are from Abramowitz & Stegun,
\ Handbook of Mathematical Functions, Table 5.1
: expint_test ( -- )
CR
." x E1(x) exact ExpInt[x] " CR
." 0.5 0.5597736 "
% 0.5 expint F. CR
." 1.0 0.2193839 "
% 1.0 expint F. CR
." 2.0 0.0489005 "
% 2.0 expint F. CR
." 5.0 0.001148296 "
% 5.0 expint F. CR
." 10.0 0.4156969e-5 "
% 10.0 expint F. CR
;
找到上列數學式子,您就立刻明白指數積分高級函數FORTH程式是如何設計的了。進一步仔細查核上列兩個有理多項近似式的來源,書中參考資料詳實的記載為美國國家標準局出版的數學函數使用手冊:the Handbook of Mathematical Functions, U.S. Department of Commence, National Bureau of Standards, Applied Mathematics Series 55, 1900.
我對此書出版的年代『1900』存疑,可能是『1960』的手植之誤,但沒有能力追查到這本使用手冊予以證實。我們可以合理的懷疑,19世紀以前,可能還沒有能力算出那麼多個小數點後面十位數的精確數字,1960年附近才有可能,因為,計算機技術,1960年代以後才開始崛起。
Everett F. Carter心地善良,免費提供大家好用的程式,被引用的紐約計算機協會(ACM:Association for Computing Machinery Inc., New York),只是一個換了包裝後的單位,書籍雖是1980年出版,實際技術出處則仍來自於更早的數學研究結果。
如果要直接改寫傳統的FORTH程式成ABC FORTH系統要求的格式,是一件非常痛苦的事情,所以我才會追根究底的查找技術的原始出處,找到之後仔細閱讀,然後,只花了半小時,就用ABC FORTH數學計算系統設計完成了下列完全一樣的程式: