星历里的误差,到底出在输入、公式,还是机器里?
同一个结果要经过四道关:输入、算法、内部运算、最后显示。不要把它们混成一种“精度”。
程序可以显示很多小数,但输入时刻可能已经被舍入,公式可能省略了项,内部运算也可能丢失细节。把这些步骤逐个拆开,才能知道改哪里真正有用;只换输出格式,通常改不了前面的误差。
打开互动课程 →
先猜一下
把内部算错的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 章