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,数学固定点1/3却会在浮点运算中偏离。原书硬件的具体输出不当成所有机器固定结果。迭代超1e100或非有限时停止,模型T范围限定±1世纪;星等有意义位数另见行星照明/星等课。

我的理解检查

完整公式与省略项版本不同,主要是哪一层误差?

算法近似 — 省略项直接改变了数学计算模型。

若cos把一个极小角已经舍入成1,再用acos能恢复原夹角吗?

不能,需要保留更多有效信息或换稳定路线 — 相同的输入1无法区分原本是零角还是很小的非零角。

3月15.88日应该简单四舍五入成3月16日吗?

不应该,日期仍属于15日 — 它表示15日午夜后0.88天。日期标签分段与最终数值舍入不是同一操作。

先分清误差在哪一层,再决定是补数据、改公式、换数值方法,还是仅调整报告位数。

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

通用算法与数值计算 · 全部互动课程