星歷裡的誤差,到底出在輸入、公式,還是機器裡?
同一个结果要经过四道关:输入、算法、内部运算、最后显示。不要把它們混成一種「精度」。
程式可以顯示很多小數,但輸入時刻可能已經被捨入,公式可能省略了項,內部運算也可能遺失細節。把這些步驟逐一拆開,才能知道改哪裡真正有用;只換輸出格式,通常改不了前面的誤差。
開啟互動課程 →
先猜一下
把內部算錯的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 章