2026年9月16日 星期三

九磚柴火爐與分數運算體系

九磚柴火爐與分數運算體系


曾慶潭 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 ;

沒有留言: