九磚柴火爐與分數運算體系
九磚柴火爐與分數運算體系
曾慶潭 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 ;
沒有留言:
張貼留言