从零开始的 Nix 三角函数数学库 - 蓝天 @ 博客

主要观点:作者为计算所有 VPS 节点间的网络延迟并添加到 Bird BGP 守护进程配置文件中,因节点多不想手动运行ping命令,想到通过标记节点物理位置经纬度计算物理距离再除以光速一半得到近似延迟,由于使用 NixOS 管理配置,需用 Nix 计算距离,起初用 Python 的geopy模块计算但速度慢且不能并行,于是开始实现纯 Nix 的三角函数库来计算距离。
关键信息

  • 介绍了用 Haversine 公式计算两点间距离的方法及 Nix 语言不原生支持三角函数的问题。
  • 详细阐述了用泰勒展开式实现正弦(sin)、余弦(cos)、正切(tan)函数,通过控制泰勒展开项数和精度满足精度要求。
  • 用多项式回归近似反正切(atan)函数并在 Nix 中实现。
  • 用牛顿迭代法实现平方根(sqrt)函数。
  • 最后实现 Haversine 公式计算两点间地表距离并得出理论延迟,所有三角函数函数可在 GitHub[https://github.com/xddxdd/nix...]获取,在 Nix Flake 中使用函数的示例。
    重要细节
  • 正弦函数泰勒展开式为(\sin x = \sum_{n=0}^{\infty} (-1)^n \frac{x^{2n+1}}{(2n+1)!} = x - \frac{x^3}{3!} + \frac{x^5}{5!} -...),通过控制展开项数和精度来保证精度。
  • 反正切函数在([0,1])上用 10 次多项式拟合,其他范围通过映射得到。
  • 牛顿迭代法求平方根的迭代公式为(a_{n+1} = \frac{a_n + \frac{x}{a_n}}{2})。
  • Haversine 公式中地球视为半径 6371km 的球体,通过一系列三角函数计算距离。
阅读 32
0 条评论