2026年7月16日 星期四

自創浮點系統的新問題

自創浮點系統的新問題


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
16 July 2026


1. 問題的發現:

我在修改2025年11月2日貼文『­誤差函數的應用』中之實際程式,以供自創浮點系統使用時,出現了問題,顯示原始程式無法順利通過編譯。

2. 問題說明:

自創浮點系統的規格,係2024年7月10日貼文『設計浮點系統』文中的格式,這個格式於 2025 年我回台灣與 FORTH 同好開研討會時,當場重建在 gForth 系統過,性能驗證無誤。因此,修改『數據分析應用程式』時,應該是只須要將所有輸入的浮點數字改成由三個單元形成的浮點數字便可。很不幸,未能通過編譯。

3. 除錯記錄:

經過操作 Forth 傳統的除錯方式後,發現未能通過的設計只存在於最後一個 MAIN 指令中,而且就是列號為 60 的程式,原程式轉錄如下:

60 LET { erfx = ( ABS ( DATA ( I ) - AVG ) ) / ( sqrt ( 2 ) * sigma ) }

特別說明 ! 上式本為只能在浮點系統中的寫法,開平方函數操作的對象 2 能夠這樣寫,係我專為 Win32Forth 系統設計 ABC Forth 時的特例,系統編譯時,能自動將所有的數字都自動處理成浮點數,但不處理陣列、矩陣、張量的整數指標。至於在其他 Forth 系統中加建的 ABC Forth 則均不具有這種功能。

除錯後第一次的改寫,寫成下式,很不幸,仍然不能通過編譯。

60 LET { erfx = ( ABS ( DATA ( I ) - AVG ) ) / ( sqrt ( 2.0 E 0 ) * sigma ) }

磨耗了許久,我才確定,問題的根源就是這種自創浮點系統的數字格式,會搞混數學運算先後秩序的編譯,於是再增加了一層小括號,令 ( sqrt ( 2.0 E 0 ) ) 可以被強制優先執行,最終落定的格式寫法如下:

60 LET { erfx = ( ABS ( DATA ( I ) - AVG ) ) / ( ( sqrt ( 2.0 E 0 ) ) * sigma ) }

4. 檢討分析:

顯然,我自創的浮點系統,確實有未能全面顧及所有狀況的缺陷,透過原始 Lina64 Forth 系統中的 SEE 輔助除錯指令,可以看到能被編譯成功的設計內容。單獨重寫一列小程式來檢驗編譯成果時,能夠發現以三元浮點規格輸入的數字,如果運算優先度處理不當,編譯後會出現 0 * sigma 結合成一組運算的現象,執行 MAIN 指令時就顯示浮點運算無法執行的提示。

5. 解決方法:

暫時先使用能強迫可以被最優先執行的成對小括號 ( ..... ) 來解決問題。

現在只能預想,我使用三元浮點數輸入法中的 E 指令,也必需宣告它被執行時的優先度,系統才能被正確的執行。

6. 題外話:

設計系統、使用系統、測試系統是一件冗長辛苦的工作,能夠發現問題的初衷,係我想將一些有用的程式重新改寫進最新設計出來的系統中使用。能發現新問題是好事,不要氣餒,必須直接面對問題、解決問題。

挑選這個程式來修改,也有原因。我向來擅長親自動手做實驗,也擅長對取得的實驗數據進行技術分析。數據分析程式的功能很有用,它不但能應用於實際科學,也能實際應用於日常生活。

原始程式中舉例的應用,係我在從事於鋁合金冶煉時的測試數據。我也曾將此技術應用於微弱中子源的測量讀數分析中,效果非凡,曾經用它來過濾掉幾根無效的中子探測器,並從中挑選出僅存的一根略為多加 100V 工作電壓(正常為 2400V ,勉強改用 2500V) 尚能使用的中子探測器。從事於固態燃料電池研究時,也用此技術來分析被測量材料導電度的實驗數據。用得最多的地方,則是我在從事於原子爐運轉擔任工程師時,核驗技術員抄表所得數據的合理與否?當然,這樣做容易引起當事人的不滿,所以,我通常都是默默地做,除非數據相當關鍵,影響重大,我才會取用這種有統計根據的分析結果,公開要求當事人慎重處理抄表所得。我記得有位學弟在測量中子的通量分佈時,出現一個被照射金片的測量讀數超出合理範圍,他的實驗結果則對日後一整年照射服務的演算影響重大,因此要求他務必找出問題的根源,結果他重新檢討了三天,終於找出問題所在,我這樣管理員工確實是苛求他了,但不得不做。

最近的日常應用,則是我用它來分析每天固定時間測得的血壓讀數。年紀大了,每天使用血壓計量血壓並檢討結果是一件很有益的事情。如果數據不太離譜,我只記錄。如果我認為不太合理,我就先透過誤差函數進行統計分析,看看得到的結果是否合理? 不合理時,大膽略去,重新測量。出現問題,我就檢討問題。後來,經常發現,問題主要出現在一開機就測量的讀數上,解決辦法就是首次的讀數就棄用,每次測量三次,大部份就都沒有問題了。

自測血壓本不是個人該做的事情,讀數不好時絕對會影響心情,專業醫療人員測血壓時都用聽診器聽脈博脈動的聲音。家庭自測用的數位式簡易血壓計所測得的讀數只宜供作個人參考,不要過份解讀,畢竟我不是醫療從業人員,又沒用聽診器仔細聽脈音,套上抽真空束帶時,難免偶爾沒放準脈博偵測點,讀數就有偏差了。自測血壓跟做實驗一樣,需要注意測量時的正確性、穩定性、不受干擾性。分析讀數的技術是重溫本領,用自己設計的系統、自己設計的程式解讀問題,讓很多事情變得很有意義。

每天測量血壓後檢討生活,最近的體會是發現速食麵、高分子蛋白的花生、市面販售的濃湯粉包、含鹽份過度的馬鈴薯片等,都是上了年紀的人不宜接觸的食物。我每次在當天貪吃之後,洗澡前測一下血壓,同樣狀況的結果必定多出大約 10 個讀數,隔天不吃了,血壓就能降回大約是 120/80 的正常讀數,每天記錄,屢試不爽。我也發現多吃了一些南瓜湯、紅豆湯、羅宋湯都不影響血壓,也不會增加體重。這些事都是我最近的生活,有程式應用上的樂趣,也有滿意於健康的心情。

新改寫成的程式與執行結果列示如下:


 

\ 數據分析程式
\ 分光儀測量鋁錠中鐵含量(%)十次,分析這十個測試數據是否合理的程式。
\ 作者:曾慶潭 2011/4/21 保有一切版權,知會作者,附加本宣告則允許引用。
\ Copyright 2011/4/21 Ching-Tang Tseng
\ Permission is granted by the author to use this software
\ for any application provided this copyright notice is preserved.

20 VALUE SIZE

SIZE ARRAY DATA

REAL AVG
REAL SIGMA

INTEGER TOTAL
INTEGER I

: INPUT-DATA
{{ DATA ( 1 ) = 121.0 E 0 }}
{{ DATA ( 2 ) = 122.0 E 0 }}
{{ DATA ( 3 ) = 138.0 E 0 }}
[[ TOTAL = 3 ]]
\ {{ DATA ( 1 ) = 1.52 E 0 }}	\ (1)輸入待分析數據。
\ {{ DATA ( 2 ) = 1.46 E 0 }}
\ {{ DATA ( 3 ) = 1.61 E 0 }}
\ {{ DATA ( 4 ) = 1.54 E 0 }}
\ {{ DATA ( 5 ) = 1.55 E 0 }}
\ {{ DATA ( 6 ) = 1.49 E 0 }}
\ {{ DATA ( 7 ) = 1.68 E 0 }}
\ {{ DATA ( 8 ) = 1.46 E 0 }}
\ {{ DATA ( 9 ) = 1.83 E 0 }}
\ {{ DATA ( 10 ) = 1.50 E 0 }}
\ [[ TOTAL = 10 ]]		\ (2)數據的總量為10。
;

: RESET-DATA BASIC
10 FOR I = 1 TO SIZE
20 LET { DATA ( I ) = 0.0 E 0 }
30 NEXT I
40 LET TOTAL = 0
50 END
;

: AVERAGE BASIC
10 LET { AVG = 0.0 E 0 }
20 FOR I = 1 TO TOTAL
30 LET { AVG = AVG + DATA ( I ) }
40 NEXT I
50 LET { AVG = AVG / I>R ( TOTAL ) }
60 END
;

: DEVIATION BASIC
10 LET { SIGMA = 0.0 E 0 }
20 FOR I = 1 TO TOTAL
30 LET { SIGMA = SIGMA + ( DATA ( I ) - AVG ) * ( DATA ( I ) - AVG ) }
40 NEXT I
50 LET { SIGMA = SQRT ( SIGMA / ( I>R ( TOTAL ) - 1.0 E 0  ) ) }
60 END
;

: REPORT BASIC
10 RUN CR
20 RUN RESET-DATA
30 RUN INPUT-DATA
40 RUN AVERAGE
50 RUN DEVIATION
60 RUN CR
70 PRINT { " 平均值(Average value) = " ; AVG }
80 RUN CR
90 PRINT { " 標準誤差(Standard deviation) = " ; SIGMA }
100 RUN CR
110 END
;

REAL erfx   REAL erfy
REAL T   REAL D   REAL AUX

: ERROR-FUNCTION BASIC
10 LET { AUX = ABS ( erfx ) }
20 LET { T = 1.0 E 0 / ( 1.0 E 0  + 0.3275911 E 0  * AUX ) }
30 LET { D = EXP ( NEGATE ( erfx * erfx ) ) }
40 LET { erfy = 1.0 E 0  - D * T * ( 0.254829592 E 0 + T * ( -0.284496736 E 0       
         + T * ( 1.421413741 E 0  + T * ( -1.453152027 E 0  + 1.061405429 E 0  * T ) ) ) ) }  
50 IF  { erfx >= 0.0 E 0 } THEN 70
60 LET { erfy = NEGATE erfy }
70 END
;

REAL TIMES
INTEGER Discrimination
INTEGER FLAG
1.41421356237309 E 0 fconstant sqrt2

: MAIN BASIC
30 LET FLAG = 0
40 RUN REPORT
50 FOR I = 1 TO TOTAL
\ 60 LET { erfx = ( ABS ( DATA ( I ) - AVG ) ) / ( sqrt2 * sigma ) }  
60 LET { erfx = ( ABS ( DATA ( I ) - AVG ) ) / ( ( sqrt ( 2.0 E 0 ) ) * sigma ) }   
70 RUN ERROR-FUNCTION
80 LET { TIMES = 1.0 E 0 / ( 1.0 E 0 - erfy ) }
90 LET Discrimination = INT ( TIMES )
100 IF Discrimination > TOTAL THEN 120
110 GOTO 160
120 LET FLAG = FLAG + 1
130 PRINT " 統計分析顯示,數據 DATA( " ; I ; " ) = " ; { DATA ( I ) ; " 有問題。 " }
140 PRINT " 此值之誤差量,應該是測量 " ; Discrimination ; " 次以上才有可能出現一次。 "
150 PRINT " 但是這次測量, " ; TOTAL ; " 次就出現一次了,故有問題。"
160 NEXT I
170 IF FLAG <> 0 THEN 190
180 PRINT " 根據誤差函數核算結果顯示,所有數據的誤差量均在合理範圍之內。 "
190 END
;


\s

執行結果:

ching@ctt:~$ ./l

AMDX86 ciforth 5.3.0 
fload dataanaly.f
DATA : ISN'T UNIQUE                                                
I : ISN'T UNIQUE                                                
D : ISN'T UNIQUE                                                

Programs above \S have been loaded. 
 OK
main

平均值(Average value) = 1.27 E 2  

標準誤差(Standard deviation) = 9.5393920141 E 0  

統計分析顯示,數據 DATA( 3 ) = 1.38 E 2  有問題。 
此值之誤差量,應該是測量 4 次以上才有可能出現一次。 
但是這次測量, 3 次就出現一次了,故有問題。 OK


2026年7月2日 星期四

創造與實踐特別指令

創造與實踐特別指令


曾慶潭 Ching-Tang Tseng
ilikeforth@gmail.com
Hamilton, New Zealand
2 July 2026


創造(CREATE)與實踐(DOES>)兩個 FORTH 標準指令結合在一起使用時,形成一種任何其它程式語言所缺乏的特殊現象。

我將以特殊的手法介紹 CREATE ..... DOES> 指令組。就學習難度分類,這一組算是三級的難度,比二級的 WORD、NUMBER 難一點,比四級的 Multitasking 或 Meta-compiling 觀念簡單一點。

古時候, CREATE 的名稱為 <BUILDS ,而且設計出指令的方法有一點差異, 79 標準以後指令名稱就修改並固定成 CREATE 了。在台灣的 FORTH 同好, 1980 年代使用 AIM65 壓克力封裝的透明電腦、追蹤最原始被公開的 fig-FORTH 系統源程式、閱讀古老的 FORTH 技術文獻 ..... 等狀況時,還有機會見到被使用的 <BUILDS 名稱。我在設計 ABC FORTH 數學計算系統時,也久別重逢了這個指令,所依據的最原始程式,就用 <BUILDS 而不是 CREATE 。

我不跟寫別人的教材,如果沒有自己獨特的一套解說方法,來強化大家學會打算談論的主題,就不該浪費讀者閱讀本文的時間,所以,我會使用特殊的手法寫 FORTH 教材。

我的網文教材中大部份只有淺顯的觀念,但直接切中難了解的相關 FORTH 指令,教會您實際的使用方法。至於一般 FORTH 老手喜歡探討的指令詳細結構,我完全不提。因為,我知道,有一天,您渡過了使用 FORTH 創作程式的初期困難後,會主動的去追蹤每一個指令的細部結構,不需要別人督促。您若不能渡過那種困難,就不會進一步的想深入了解 FORTH 內在系統的結構。因此,教您那些東西,有可能是在浪費時間。現在,我們仍然從外在的使用觀點,經由特殊觀念了解 CREATE ..... DOES> 。

這份教材,調皮的部份,取材自 comp.lang.forth 網頁的一些討論,如果您英文已經看得很順當了,我也介紹您直接去參訪,它不是一個只有我能獨享的 FORTH 科技園地。另外,請不要輕忽那些討論內容,我尊重所有的專家,所以會有『網文』可能比『論文』來得快又來得重要的論點,這是莫之能禦的時代趨勢,老頑固、老學究堅持抵制說『它不正式』也沒有用,頭腦靈活的人早就經常拿這些技術先行實現了許多夢想,寫 FORTH 網文的好手,從來就不在乎公開任何好技術後,會失去可以取得成為博士論文的機會,他們在嘉惠大眾,我因佩服而學習他們。

一般而言,純用電腦專業術語來解釋 CREATE ..... DOES> ,可能還不夠強烈,學習者就不易搞清楚它們的意義,不能記住使用方法,也就難以用來設計特異程式,發揮別種程式語言所沒有的效果。靜宜大學的金城老師主要專長就是電腦,我們曾談過簡化這一組指令的中文解釋,他說:『我宣告一個資料結構,就是 CREATE ,而且決定要怎麼用就怎麼用,就是 DOES> 。』解釋得非常好,大家不妨就這樣記住它們的意義。可是,奇怪的很,他在自己的著作『FORTH 的禪思』第八課中,卻不用這麼言簡意賅的解釋,反而寫了一大堆說明。也許是著作付梓之後,透過交談,才激發出他的簡化潛能,他有空時確實該來與我們多聊聊天,有好的話語,我會幫他記述。

為了讓指令的適當中文名稱能通順的使用於文句中,符合中文文法,以便在傳承技術或進行程式說明時感到方便,我則給予這兩個指令下列中文譯名:

CREATE 創造(資料結構)
DOES> 實踐(後續指令)

此處仍是列而不議(爭議),讀者請笑納便可,我們的重點在只談技術。

這兩個中文名稱又好又偉大,它們的功能確實也是如此,誇張一點形容,單憑這一組指令的功效, FORTH 的性能就足以蓋過其他現行的任何程式語言,寫程式時還能隨心所欲的『創造』和『實踐』,豈有不被稱為最偉大的道理?

為了更清楚解釋它們的性能,我要離題另行介紹一些機械工程學方面的知識,引用這些知識來解釋,就能更加明白這種指令的性能,這樣子學習,有助於強化您的記憶,也增加您對機械工程方面的認識。

學機械工程會見識到許多重型的產業生產用機器,有一些機器被冠以『工作母機』的美好名稱,例如:古時候被稱作車床、銑床、刨床、磨床、鑽床、研床、搪床…者(簡稱:車銑刨磨鑽研搪),均可算是工作母機。其他的機器就不能被納入工作母機的行列,例如:沖床、夾床、壓床、軋床、鍛床、鋸床、油壓機、輸送機、放電加工機、射出成型機…等。這兩者之間有甚麼區別?簡而言之,生產出來的工件成品,可以直接當作其他機器之零件者,才能被稱之為工作母機,例如:車床車製出螺絲,可以給別的機器當零件使用,車床就是。反之,沖床沖製出金屬鍋、碗、瓢、盆,不能給別的機器當零件使用,沖床就不是。『工作母機』就是機器的母級機器,提到她會肅然起敬。

時代在進步,近代的工作母機有了一點變化,例如:機械引擎的活塞缸套,已經發展出了快速、簡便、經濟的生產方法,用搪床來搪缸的機械加工就減少了,這個工作母機也就逐漸式微而少見。又如:以銑刀銑製金屬工件表面的技術,發展得相當進步,製品的品質,已可媲美於傳統龍門刨床刨製出來的金屬表面要求,銑床可以同具刨床的功能,於是刨床也逐漸式微而少見了。現行機械工廠中可以人工操作的工作母機,大約只剩車床、銑床、鑽床三種機器,屬於必備,其他的則可以功成身退了。機器配上了協助自動化的電腦,則改稱 NC 工作母機, NC 是數值控制(Numerical Control)的意思,因為用來操控機器的電腦程式中,大量的使用指揮機器定位或定速所須要的數值,故得其名。機械工程系的學生,學習機械製造這一門科目時,會學到上述這些知識,進行工廠實習時,就會直接接觸這些機器。如果您希望一生都有機會運用機器來創造東西,那麼,大學就該選讀機械工程系,現在則專心談論我們的 CREATE ..... DOES> 兩個 FORTH 指令。

實際用過 FORTH 設計較高級程式後,您才會發現,多工程式(Multi-task)中的 NEWTASK、ALSOTASK 這種指令組,與現在正要討論的創造(CREATE)、實踐(DOES>)此一指令組,都像機械工程學中的工作母機,它們形同為『造指令的指令』,也就是它們都用來設計『零件指令』,再供『應用指令』使用,『應用指令』才能夠方便的被執行,它們就形同是『母級指令』,用到它們當然會肅然起敬。接下來,我們逐步介紹運用這組指令的使用範例。

FORTH 中的標準 VARIABLE 指令,也可以用上述 CREATE ..... DOES>『母級指令』來設計,這是最簡單的這一組指令使用範例,例如按照下列程式逐列操作:

: VARIABLE1 CREATE 0 , DOES> ; ok
VARIABLE1 TEST1 ok
18 TEST1 ! ok
TEST1 @ . 18 ok

這個 VARIABLE1 的功能,就與 FORTH 中的標準變數宣告指令 VARIABLE 完全一樣了。

其中, TEST1 相當於是一個『應用指令』,可以在程式中到處應用,它須要使用 VARIABLE1 這種『零件指令』才能宣告形成,而『母級指令』 CREATE ..... DOES> 則可以完成『零件指令』 VARIABLE1 的設計。

仔細追蹤 VARIABLE1 『零件指令』的設計內容,從創造(CREATE)資料結構開始,系統首先根據使用者隨後使用時,賦予的任意名稱 TEST1 ,在系統中創造了一個變數的資料結構,而且先將資料內容歸 0 ,創造到此結束。此後,每逢 TEST1 變數被應用而執行時,系統就實踐(DOES>)後續指令,此簡例中沒有任何指令,於是實踐(DOES>)就只執行將創造完成的 TEST1 資料結構之參數欄起始位址,放在系統數據堆疊上,僅此一項工作為實踐(DOES>)天生非做不可的實踐內容,實踐到此結束。

以前,有一個馬戲團小丑,在表演模仿走鋼索前,把地板掃一掃,想放置脫下來的外套,可是等他脫下外套後,卻把外套丟到很遠很遠沒掃過的地方去了。小丑的調皮,可以引起觀眾開懷大笑。我們也來學一學小丑,調皮的不按規矩使用這一組母級指令,依序執行下列程式,就能看到它們的效果:

: NAUGHTY1 CREATE DOES> DROP 1 . ; ok
NAUGHTY1 TEST2 ok
TEST2 1 ok

這組母級指令造好的 NAUGHTY1 零件指令,被 TEST2 應用指令使用時, TEST2 根本沒有資料結構的體部,也就是根本沒有內容,應用指令 TEST2 每次被執行時,卻都拓印出 1 ,它天生非做不可的實踐內容,實踐完了就立刻被丟棄不用了,這個程式就像上述的小丑,有一點調皮,卻產生了一點特殊效果。

既然調皮有點看頭,那就進一步調皮一點,看看使用兩組實踐 DOES> 配一組創造 CREATE 的效果,又會如何?依例逐列執行程式,得到了下列結果:

: NAUGHTY2 CREATE DOES> DROP 1 . DOES> DROP 2 . ; ok
NAUGHTY2 TEST3 ok
NAUGHTY2 TEST4 ok
TEST3 1 ok
TEST4 2 ok

您可以跟著調皮下去,看看續用這個 NAUGHTY2 零件指令,多宣告出幾個應用指令,會有甚麼結果?還有更調皮的設計,設計成下列:

: NAUGHTY3 CREATE BEGIN DOES> DROP 1 . DOES> DROP 2 . AGAIN ;

注意! BEGIN ..... AGAIN 是一個無限循環,這樣子設計程式,執行起來竟然可以不毀系統,而且您還可以照常在 ABC FORTH 系統中繼續發展程式,請您自己試一試這些現象,或者想辦法比上述所有程式更加調皮,看看能有甚麼結果?

我不聰敏,拿這樣的範例來應用,仍然可以設計一個上課點名遊戲程式,只是學生都是虛擬的存在電腦中。

\ 母級指令 CREATE ..... DOES> 測試程式
\ 作者:曾慶潭 2010-02-16

: 男學生 CREATE DOES> DROP ." 有!我是男的。" ;
: 女學生 CREATE DOES> DROP ." 有!我是女的。" ;
: 兩性生 CREATE BEGIN
DOES> DROP ." 有!我是男的。"
DOES> DROP ." 有!我是女的。"
AGAIN ;

\ (( 使用範例:上課點名遊戲程式
男學生 湯姆
女學生 瑪莉
兩性生 喬治
\ ))

您可以實際去執行一下,分別鍵入學生的名字後,看看結果。『喬治』則要多點幾次名,他(她)真的會忽男忽女,好像有一個名叫『喬治男孩』的明星就是這樣,他(她)們有公開存在於現今世界的權力,不要以異樣的眼光看待他(她)們。我們的 FORTH 真正是一個既古老又先進的程式語言,它憑著創造(CREATE)與實踐(DOES>), 在 58 年前(1968),就把今天這個時代的爭議性問題處理得這麼好。

談起如此的一組 FORTH 傑出指令,實在可以創作出無限的調皮話題。

我所設計的 ABC FORTH 數學計算系統,更是靠著它們才得以完成,系統裡面的所有變數結構都在變化。變數出現在等號『 = 』的左邊或是右邊時,性能就得不同。變數若使用於浮點數的環境,如果還得用到指標,它的指標就只能為整數,有幾個整數還得視情況而定。這麼囉嗦的要求,如果不用調皮的手法,可能很難完成設計。

能用上述模式解釋這一組傑出指令,平生就得多學、多用、多涉獵各方面的知識,頭腦才能有豐富的聯想力來進行描述,讀者可能看似簡單,實則未必,要強調這樣的論點,可以透過一個別人講過的笑話來形容它,您自己體會,同時結束本文。

一個幼年私塾,有一班幼童背頌了一段課文,內容是:
『人坐著吃飯,馬站著吃草。』
過了一會兒,私塾的老先生要幼童起來背頌這篇課文,小華先背,可是站起來就怕老先生用戒尺處罰,於是背出了:
『馬坐著吃草 ..... 』
大家都笑了,老先生有點生氣,用戒尺從輕發落了一下小手心就算了,換小明站起來再背頌,小小的心靈真可憐,同樣的狀況:
『人站著吃飯 ..... 』
老先生再輕輕的打了小明一下小手心,讓他坐下,然後說:
『這麼簡單都不會,現在大家把書本合起來,都跟著我唸。』
『人坐著吃馬 ..... 』

這兩天紐西蘭夜間的氣溫低於 0 度 C ,我準備貼文時確實有點冷。