Hello 天文

自動翻譯,請以簡體中文原文校核。

星歷裡的誤差,到底出在輸入、公式,還是機器裡?

同一个结果要经过四道关:输入、算法、内部运算、最后显示。不要把它們混成一種「精度」。

通用演算法與數值計算

程式可以顯示很多小數,但輸入時刻可能已經被捨入,公式可能省略了項,內部運算也可能遺失細節。把這些步驟逐一拆開,才能知道改哪裡真正有用;只換輸出格式,通常改不了前面的誤差。

開啟互動課程 →

先猜一下

把內部算錯的125°顯示成125.000000000°,能找回丟掉的小數嗎?

查看答案與解釋

不能 — 字串變長不會恢復輸入、演算法或運算過程中已經丟掉的資訊。

再把體驗和科學連結起來

輸入的細節有沒有先丟掉?

把T只保留很少小數位,相當於先把查詢時刻改粗了。後面再用精確公式,也找不回那個原輸入。

輸入舍入誤差 ≠ 公式近似誤差

公式本身省略了哪些項目?

主動省略T²、T³會改變結果。這是演算法選擇造成的差,不是給最後一行補幾個零能修復的。

完整選定書式與省略項版本分開比較

機器只能保留有限細節

大角先算到幾十萬度再歸一化,會暴露內部有效位不足。小角的cos接近1時,直接反求也可能丟掉夾角。

選擇數值穩定的運算路線

最後才決定怎樣顯示

原書海王星例中,先算完整角度再取整得到19°;先把兩個輸入取整卻得到20°。顯示位數要符合輸入與模型精確度。

先算,再作有意義的最終捨入

先分開輸入舍入、演算法截斷與浮點誤差,再以相同輸入比較完整選定書式與省略項版本。結果最後多顯示幾位小數,不會自動提昇科學模型的準確度。

試一試

先看“內部只有6位”,再把顯示改成9位——答案不會更接近參考。展開條件才能分別改變輸入、演算法和內部精度;小角與最終舍入例是另外的問題。

動手看一遍 →

符號不用背

T
從J2000算的儒略世紀;0.4約為J2040.0
內部有效位
本課模擬的十進制運算精度,不是修改JS硬體格式
顯示小數位
字串格式,不改變計算過程
acos / atan2
小角反求的兩條數學等價但數值表現不同的路線

演算法、精確度與適用範圍

補第2章計算目標所需精度、機器精度與最終報告精度的區別,避免重複舊稱重課的近數相減。實驗0採用印刷頁17的月球平均黃經多項式218.3164477+481267.88123421T−0.0015786T²+0.0000019T³;這是第2章截短書式,不是完整月球真實黃經。比較輸入T舍入、主動省略高次項、逐運算模擬十進位有效位元、最後顯示四層影響。所謂參考是同一書式的雙精度數學結果,不是實測真值或真實星曆誤差上界。實驗1使用第1/2章小角警告:atan2(sinθ,cosθ)與acos(cosθ)比較;前者仍無法恢復已遺失的輸入資訊。實驗2重現1996年海王星在Sonneberg上中天的提前捨入錯誤與1.4+1.4;實驗3重現1.0000001連續平方,並用log1p/exp與書中參考值獨立核對;實驗4重現x←(9x+1)x−1,數學固定點運算會偏離在浮點運算。原書硬體的具體輸出不當成所有機器固定結果。迭代超1e100或非有限時停止,模型T範圍限定±1世紀;星等有意義位數另見行星照明/星等課程。

我的理解檢查

完整公式與省略項版本不同,主要是哪一層誤差?

演算法近似 — 省略項直接改變了數學計算模型。

若cos把一個極小角已經捨入成1,再用acos能恢復原夾角嗎?

不能,需要保留更多有效資訊或換穩定路線 — 相同的輸入1無法區分原本是零角還是很小的非零角。

3月15.88日應該簡單四捨五入成3月16日嗎?

不應該,日期仍屬於15日 — 它表示15日午夜後0.88天。日期標籤分段與最終數值舍入不是同一操作。

先分清誤差在哪一層,再決定要補數據、改公式、換數值方法,還是只調整報告位數。

Jean Meeus · Astronomical Algorithms, 2nd ed. · 第 2 章

通用演算法與數值計算 · 全部互動課程