九磚柴火爐與分數運算體系
曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
16 September 2026
本篇貼文以 Raspberry pi5 + Ubuntu 24.04 LTS + 注音符號輸入法完成初稿。
相傳三國時代(西元220~280年),曹軍營地使用了一種所謂的 『九磚柴火爐』 解決軍隊行軍時的炊事問題。 此種爐子輕巧方便,高效節能,能用來解決家居院落內廢枝柴的處理問體。 實踐是檢驗真理的唯一標準,我從今年三月二十一日起,每天中飯就藉此爐燒製出午餐,用起來已得心應手,每天都樂此不疲。 我並不打算永遠用它,只打算在解決完庭院內廢枝柴後停止使用。
顧名思義,九磚柴火爐是由九塊磚頭合理堆積而成的,中國的歷史上,早在五千多年以前就有磚窯的燒製技術。 在最近甘肅慶陽南佐遺址的挖掘考古中,發現了黃帝時代(5100~4700年前)夯埋之帝王級別的城堡宮殿內,就有燒製陶器磚瓦的窯及其廢棄物,證明了中國製磚的歷史超過五千年。
燒柴煮飯本有排放煙灰會污染環境的問題,但是廢枝廢柴任其自然腐爛,最後生成甲烷,也是六大溫室限排氣體之一。 合理妥善的燒柴用火,反而是更高效處理掉廢枝柴的方法之一。 廢枝柴是已經乾置夠久的可燃之柴,實際上燒起來並無大煙,只在點燃時免不了有煙,我每天中午燒飯大約一個半小時,大部份時間沒有煙。 我從小當過小樵童,在臺灣宜蘭利澤簡海邊的防風林裏撿過廢乾柴,也在臺南新營市中心天主教幼稚園放學回家,回到新營中山公園的路上,經常撿拾路邊大樹的落枝回家當柴火,作爲引火之用。 我記得 1960 年的年代,我唸高中時,大部份的臺灣家庭仍然燒煤或者燒著柴火煮飯。
沒上小學之前,我在外婆家過日子,兩位舅媽輪流煮飯,一人一星期,我喜歡跟外婆一起司爐,每當舅媽準備炒菜時,她會說:給火旺起來。 我就趕緊塞一把細枝梗入爐膛,這時會有濃煙回嗆出來,我外婆就立刻將一根中空的細竹管插進爐膛中央,吹一口氣,旺火就點燃了。 現今的社會強調燒柴火有所謂的 PM 2.5 危害,依我看,多慮了,我外婆活到 104 歲,於 2003 年過世。 當然,她不是通例,燒柴火時最好還是戴上口罩。
外婆家裏燒柴火的廚房爐灶臺,表面鋪設了光滑紅色的琉璃磚,易於清洗不積油垢,長久使用下來,難免有些廚房的味道,並不難聞。 我知道燒柴火的爐子會有這種問題,因此只宜將其放在開敞的車棚下,就可以不管使用時煙灰到處亂飛的問題。 我在試用單純的九磚柴火爐一段時日之後,發現使用時的主要問題,是炒菜鍋上爐炒起菜來,磚頭很容易崩塌垮掉。 爲此,我刻意改善了爐外的結構,另外採用四塊空心磚補強,從此之後磚頭就不會倒塌了。
想把事情做得好,除了爐子外,還有一些輔助工具應該準備,長火鏟、長鐵夾、長通條、打火機、扇子、水桶、水瓢、數位時鐘、吹風機、溼抹布、回收剩碳時可盛裝且可封蓋之鐵桶、蓋桶用的鐵板、鐵製的濾灰撈網、裝灰的盆子 ····· 等等等東西,都是我另外置備的物品,每天都用。 柴火是曬乾一年以上的木柴,劈柴時,我只用一個 8 磅重的榔頭,敲撃一把小斧頭,順着柴火木頭的紋理來劈柴,一塊直徑超過一公尺的柴火,照樣能被輕鬆的劈成小塊,尺寸以能被放進爐膛爲準。 由於此爐沒有爐篦,只能每天清理爐灰,清出來的爐灰,我傾倒在菜圃內當肥料,也能用來防蝸牛。
長言不如一見,我直接把照片貼在這裏,所有物品的功能就不用細說了,看了就能直接明白。
我一生的專長好像都在搞爐子,大學學的是核子工程,主要工作就是搞原子爐。 當兵退伍,退出核工界,進入社會後,搞鋁合金錠生產,用的是耐火磚造的平爐,專業上的稱呼叫作反射爐。 因此,我對各種爐子的性能有點認識,九磚柴火爐必須用耐火磚才能蓄得住高溫,耐火磚才不會被燒裂,這樣堆積而成的爐子,爐膛大小最適中。 由於操作起來極爲方便,短的柴火可從上方添入,長的柴火可從下方添入,下方的開口也是進風道,扇子就對著這裏搧,需要強風吹火時,就用吹風機對著這裏吹。 清理灰燼時,可以拆掉前爐口的三塊蓋磚,也可以不拆磚,直接進行鏟除灰燼的工作。爲了不浪費柴火,燒完中飯後,我就經常退出剩柴,放進鐵桶,蓋上鐵板,滅了火苗,剩柴隔天還能使用,而且更容易被點燃。
燒柴火煮飯·燒湯·燉菜·煎香腸最爲適合。還在燒柴火過生活的年代,家裏經常就是我司爐,我母親炒菜。 現代的電鍋都不燒出鍋巴來了,適度焦黃的鍋巴是很香又健胃的東西,能用柴火燒飯的人都知道,燒出的飯有無鍋巴?是飯鍋只差一分鐘內離開火爐的問題,我已擅長這樣子煮飯。做菜有廣大的學問,中國人擅長,喜歡又願意動手煮出食物的人,知道樂趣也在其中。
分數運算體系
2012年,我在研究建造各種數學體系時,首先拿分數體系進行了試驗,因此而建立過分數的運算體系。
分數運算雖為小學生的課題,它卻不容被忽視,原因是分數是一種絕對數值的數學體系,人生中也常有以分數表示事物的需要,例如:三個人平分,就表示每個人分到三分之一。切一半,就表示切成二分之一。口語中常用,生活習慣中也常用。
拿建立分數運算系統作為建造數學體系的範例是個很好的練習,我就是透過這樣的練習,搞通了建立所有其他數學體系時該有的設計步驟。後來也才能分別建立了複數系統、大整數系統、大浮點數系統。設計系統時,最重要的是知道過程與步驟,設計每個系統時都有共通性,它們也都必須從純粹只使用 FORTH 設計程式的方式開始,按照秩序逐項列出的步驟,都是以考慮系統設計完成後,正式使用時不會再有所欠缺的要求為主要重點。
為方便起見,首次貼出本文時,先行只將程式貼出,有空時我再回頭補述相關內容。這個程式剛經過 Lina64 ABCForth 系統的測試,使用上沒有問題。程式內容借用了不少 gForth 公益系統提供的資源,尊重原創作者,特別聲明。
\ Fractiopn math system
\ (1)分數輸出輸入指令
\ 分母不得為0的檢查
: DenominatorCheck ( numerator denominator --- numerator denominator )
DUP 0= ABORT" Warning : / 0 Error! " ;
\ 帶分數轉換成假分數
: /3>2/ ( integer numerator denominator -- numerator denominator )
DenominatorCheck
DUP 0 < SWAP ABS >R SWAP
DUP 0< SWAP ABS -ROT XOR IF NEGATE THEN SWAP
DUP 0< SWAP ABS R@ * ROT + SWAP
IF NEGATE THEN R> ;
\ 假分數轉換成帶分數
\ 由於ANS FORTH標準中/MOD指令非一般數學規格,例如:-15 4 /NOD得-4 1而非-3 -3。
\ 故/2>3/指令的設計必須將數字全換成正整數後才進行計算,應有之正負結果亦須自理。
: /2>3/ ( numerator denominator -- integer numerator denominator )
DenominatorCheck
DUP 0< SWAP ABS >R
OVER 0< XOR SWAP ABS R@
/MOD DUP 0=
IF SWAP ROT IF NEGATE THEN
ELSE ROT IF NEGATE SWAP ELSE SWAP THEN
THEN R>
DUP 1 = \ 處理1除以1的情況
IF DROP + 0 1 THEN ; \ 注意!純整數要表示成I&(0/1)而非I&(0/0)
\ 印出帶分數
: /3./ ( i n d -- )
ROT . ." & ( " SWAP . ." / " . ." ) " ;
\ 印出假分數
: /2./ ( n d -- )
SWAP ." ( " . ." / " . ." ) " ;
\ 帶分數印成小數
\ MN. : Mixed Number dot
: MN. ( integer numerator denominator -- )
/3>2/ /.. ;
\ (2)分數資料結構
: /!/ ( n1 n2 n3 addr -- )
>R R@ 2 CELLS + ! R@ CELL + ! R> ! ;
: /@/ ( addr - - n1 n2 n3 )
>R R@ @ R@ CELL + @ R> 2 CELLS + @ ;
: /CONSTANT/ ( n1 n2 n3 --- ) ( <name> -- n1 n2 n3 )
CREATE ROT , SWAP , ,
DOES> /@/ ;
: /VARIABLE/ ( -- ) ( <name> -- addr )
CREATE 0 , 0 , 1 , ;
: /VARIABLES/ 0 ?DO /VARIABLE/ LOOP ;
: /VALUE/ CREATE ROT , SWAP , ,
DOES> /@/ ;
: /VALUES/ 0 ?DO 0 0 1 /VALUE/ LOOP ;
: /TO/
' >BODY STATE @
IF POSTPONE LITERAL POSTPONE /!/
ELSE /!/
THEN ; IMMEDIATE
\ /+!/及/+TO/待有/+/後才設計
\ (3)分數四則運算
: frc+norm ( n1 n2 -- n3 n4 = Normalize a fraction n1/n2, return n3/n4 )
\ dup 0> 0= exp-invalid-parameters AND throw
over 0= IF
drop 1
ELSE
2dup GCD
tuck /
>r / r>
THEN
;
: frc+add ( n1 n2 n3 n4 -- n5 n6 )
\ n5 n6 = Add two fractions n1/n2 and n3/n4, return n5/n6
frc+norm 2swap
frc+norm \ Normalize both fractions
rot
2dup = IF \ denom1 = denom2 ?
drop
>r + r> \ num = num1 + num2
ELSE \ ELSE
2dup * >r \ denom = denom1 * denom2
rot *
>r * r> + \ num = num1 * denom2 + num2 * denom1
r>
THEN
;
: frc+subtract ( n1 n2 n3 n4 -- n5 n6 )
\ n5 n6 = Subtract fraction n3/n4 from fraction n1/n2, return n5/n6
frc+norm 2swap
frc+norm 2swap \ Normalize both fractions
rot
2dup = IF \ denom1 = denom2 ?
drop
>r - r> \ num = num1 + num2
ELSE \ ELSE
2dup * >r \ denom = denom1 * denom2
rot *
>r * r> -
r> \ num = num2 * denom1 - num1 * denom2
THEN
;
: frc+multiply ( n1 n2 n3 n4 -- n5 n6 )
\ n5 n6 = Multiply fraction n1/n2 by fraction n3/n4, return n5/n6
frc+norm 2swap
frc+norm \ Normalize both fractions
rot * \ denom = denom1 * denom2
>r * r> \ num = num1 * num2
;
: frc+divide ( n1 n2 n3 n4 -- n5 n6 )
\ n5 n6 = Divide fraction n1/n2 by fraction n3/n4, return n5/n6
frc+norm 2swap
frc+norm 2swap \ Normalize both fractions
over 0= -10 AND throw \ Divide by zero check
>r * swap \ num = num2 * denom1
r> * swap \ denom = denom2 * num1
dup 0< IF \ numerator has the sign
negate swap
negate swap
THEN
;
: 2/3>2/
/3>2/ 2>R /3>2/ 2R> ;
: /+/ 2/3>2/ frc+add frc+norm /2>3/ ;
: /-/ 2/3>2/ frc+subtract frc+norm /2>3/ ;
: /*/ 2/3>2/ frc+multiply frc+norm /2>3/ ;
: /// 2/3>2/ frc+divide frc+norm /2>3/ ;
\ (4)分數堆疊操作
3 /VALUES/ TOP1 TOP2 TOP3
: /DUP/ ( i n d -- i n d i n d )
DUP >R OVER >R ROT DUP >R -ROT R> R> R> ;
: /DROP/ ( i n d -- )
DROP DROP DROP ;
: /SWAP/ ( i2 n2 d2 i1 n1 d1 -- i1 n1 d1 i2 n2 d2 )
/TO/ TOP1 >R >R >R TOP1 R> R> R> ;
: /OVER/ ( i2 n2 d2 i1 n1 d1 -- i2 n2 d2 i1 n1 d1 i2 n2 d2 )
>R >R >R /DUP/ R> R> R> /SWAP/ ;
: /ROT/ ( mn3 mn2 mn1 -- mn2 mn1 mn3 )
>R >R >R >R >R >R
/TO/ TOP1
R> R> R> R> R> R>
TOP1 ;
: /-ROT/ ( mn3 mn2 mn1 -- mn1 mn3 mn2 )
/TO/ TOP1
>R >R >R >R >R >R
TOP1
R> R> R> R> R> R> ;
\ /ROLL/,/PICK/‧‧‧等不設計
\ (5)分數邏輯操作
: /0=/ ( i n d -- f )
DROP 0= SWAP 0= AND ;
: /</ ( i2 n2 d2 i1 n1 d1 -- f )
/-/ /3>2/ DROP 0< ;
: />/ ( i2 n2 d2 i1 n1 d1 -- f )
/SWAP/ /</ ;
: />=/ ( i2 n2 d2 i1 n1 d1 -- f )
/</ 0= ;
: /<=/ ( i2 n2 d2 i1 n1 d1 -- f )
/>/ 0= ;
: /=/ ( i2 n2 d2 i1 n1 d1 -- f )
/-/ /0=/ ;
: /<>/ ( i2 n2 d2 i1 n1 d1 -- f )
/=/ 0= ;
\ (6)分數基本函數
: frc+invert ( n1 n2 -- n3 n4 = Invert the fraction n1/n2, return n3/n4 )
frc+norm \ Normalize fraction
over 0= -10 AND throw \ Divide by zero check
swap \ invert
dup 0< IF \ numerator has the sign
negate swap
negate swap
THEN
;
: frc+negate ( n1 n2 -- n3 n4 = Negate the fraction n1/n2, return n3/n4)
frc+norm
swap negate swap
;
: frc+abs ( n1 n2 -- n3 n4 = Absolute the fraction n1/n2, return n3/n4 )
frc+norm
swap abs swap
;
: frc+to-float ( n1 n2 -- r = Convert fraction n1/n2 to float value )
>r s>d d>f r> s>d d>f f/
;
: /RECIPROCAL/ /3>2/ frc+invert /2>3/ ;
: /NEGATE/ /3>2/ frc+negate /2>3/ ;
: /ABS/ /3>2/ frc+abs /2>3/ ;
: />FLOAT/ frc+to-float ;
: /+!/ ( i n d addr -- )
DUP >R /@/ /+/ R> /!/ ;
: /+TO/
' >BODY STATE @
IF POSTPONE LITERAL POSTPONE /+!/
ELSE /+!/
THEN ; IMMEDIATE
: /MAX/ ( i2 n2 d2 i1 n1 d1 -- i n d )
/OVER/ /OVER/ /</
IF /SWAP/ THEN /DROP/ ;
: /MIN/ ( i2 n2 d2 i1 n1 d1 -- i n d )
/OVER/ /OVER/ /SWAP/ /</
IF /SWAP/ THEN /DROP/ ;
0 0 1 /CONSTANT/ /0/ \ 0
1 0 1 /CONSTANT/ /1/ \ 1
: /^/ ( i n d n -- i n d )
>R
/TO/ TOP1 /1/ /TO/ TOP2
R@ 0=
IF R> DROP
ELSE
R@ ABS 0 DO TOP2 TOP1 /*/ /TO/ TOP2 LOOP
R> 0< IF TOP2 /RECIPROCAL/ /TO/ TOP2 THEN
THEN
TOP2 /3>2/ frc+norm /2>3/ ;
: /SGN/ ( i n d -- /-1/or/0/or/1/ )
/3>2/ /2>3/ \ normalize
/DUP/ /0/ /</
IF /DROP/ /1/ /NEGATE/
ELSE /0/ /=/
IF /0/ ELSE /1/ THEN
THEN ;
補述於 20260920:
設計數學計算系統時,首先必須考慮的問題,就是這個系統所處裡之數字必須為固定的格式,分數運算體系亦然。例如:整數運算體系為一個堆疊單元,浮點數運算體系使用兩個堆疊單元,複數運算體系使用了四個堆疊單元。分數運算體系則使用了三個堆疊單元處理三個對應的整數。
我所設計的分數運算系統,實際上只對真分數或假分數進行運算,但輸出或輸入時的表示格式必須採用帶分數,所以採用了三個堆疊單元。分數還有其他的表現方式,例如:繁分數,但在我們建立分數運算系統時不列入考慮。
相關於分數之中英文名詞對照名稱列示如下:
普通分數 Vulgar fraction
帶分數 Mixed number
真分數 Proper fraction
假分數 Improper fraction
有理分數 Rational fraction
繁分數 Complex fraction
它們的意義在小學的課程中都已學過,此處不做解釋,我們只取用帶分數與真分數、假分數三個名詞來解說分數運算時的問題。
帶分數係由下圖中所表示的方式所形成,為方便起見,我自己不另行製圖,此圖係取材自下述網頁的擷取圖,尊重創作者,故說明出處:
https://www.junyiacademy.org/new-video/q3ii8ZD2ldg?parent-topic-id=mbyg4-e
認識真分數假分數與帶分數 - 均一教育平台
www.junyiacademy.org › videos › mby › by-math › mbyg4 › mbyg4-e
2015年12月19日 · 在均一教育平台免費觀看「認識真分數假分數與帶分數」教學影片,搭配練習逐步掌握觀念.
取得擷圖的時間:20260920
上圖中的第一個帶分數,為方便起見,以純文字方式表示為 3(1/2) ,其中 3 代表一個整數 i (integer),1 代表一個整數的分子 n (numerator),2 代表一個整數的分母 d (denomirator),這三個數字都可以是正或負的整數。我們必須注意的是 : 3 與 1/2 之間沒有符號或間隔,但並不表示是 3 乘上 1/2 的意思,而是 3 加上 1/2 的意思。換句話說,手寫上的習慣 3(1/2) 是 3 + (1/2) 的意思,而不是 3 * (1//2) ,口語上唸成 3 又 2 分之 1。
帶分數(Mixed number)是比較完整的分數表示格式,它所表現的數字都是真值,所以只有有理分數(Rational fraction)此一名稱,沒有無理分數這種稱呼。帶分數要化成假分數(Improper fraction)或真分數(Proper fraction)後,才能進行純粹只有分數的四則運算。而在考慮人為的數字輸入問題時,必須將所有可能發生的數字輸入方式均列入考慮,系統在隨後的運算處裡中才能正確。由三個純整數表示出來的帶分數,其數字若均可自由的人為輸入,則三個數字均可為正數或為負數的情況便有 2X2X2=8 種,當只考慮符號的運算方式時,則簡單表示成下列只有三個正整數 i 、 n 、 d ,併同正負符號 (+/-) 的運算表示式:
(+/-)( i * d + ( (+/-) * (+/-) ) * n ) / d
我在設計將帶分數轉化成假分數的指令時,便得仔細運用上述規則,處裡各個數字均有可能為正或為負的情況,指令的堆疊格式為:
( i n d -- n' |d| )
特別聲明:
我在停用 Win32Forth 系統之後,所設計出來的 ABCForth 數學計算系統中,都已不再添加分數運算體系。原因是用處不多,因為需要分數運算者,只有小學生,但是小學生通常都不接觸程式設計。在考慮到精簡系統以利傳承後,我取消了分數運算體系這一部份的程式,避免程式過於龐大而不利於快速轉置到各種不同的 Forth 系統中去。當然,需要再用到它時,也可以隨時添加。
上列程式只是純用 Forth 設計的程式部份。實際上,我完成的設計,還包括了可以使用 BASIC 的語法設計分數運算系統的程式。它可以具有一些潛在的性能,例如:想要進行連續的分數運算時可以使用。也可以用來設計只採用有限項數算出三角函數無窮項數序列表示式的程式,所得的精確值可以是 64 位元能夠表示出來的最大整數運算範圍內之值,可以使用 MN. 指令印出來看其帶有小數點方式的表現數字。