Turns 比 Radians 更优:告别 Pi 与 Tau

Turns are Better than Radians

Turns 比 Radians 更优:告别 Pi 与 Tau

我们曾花费大量精力争论是用 Pi 还是 Tau,却忽略了更本质的问题:在代码中,Pi 和 Tau 往往可以完全移除。大多数三角函数调用中,程序员先将 0 到 1 的周期值乘以 Tau 转换为 Radians,而底层库实现(如 Godot Engine 或 AVX2 数学库)又立即将其除以 Pi 还原。这种无意义的往返转换不仅浪费计算资源,还导致 90 度等常见角度无法精确表示。相比之下,使用 Turns(转)作为单位,将圆周定义为 0 到 1,不仅能消除冗余乘法,还能让 0.25、0.5 等值在二进制中精确存储。无论是重写数学库还是利用 CUDA 的 sincospi 等现有函数,转向 Turns 或 Half-turns 都能让代码更简洁、高效且精确。

数学从未规定正弦和余弦函数必须接受 Radians 作为参数!
  1. kazinator

    用“转(turns)”做单位时,数学绝对没那么完美,因为你的欧拉公式 e^ix = cos x + i sin x 不再成立。我们可以用 e 以外的底数,比如 B = e^2π,约等于 535.4916。但这失去了 e 的那些优美性质,比如 d/dx e^x = e^x。

    自然对数的底数既是一个导数等于自身的指数函数的底数,又恰好出现在上述欧拉公式中,这一优雅事实表明弧度是特殊的:就像二进制之于计算机。

    自然对数导数等于自身,这一点直接关联到基于弧度的 sin(x) 的导数是 cos(x) 等等。换成任何其他单位,你都会得到一堆比 2π 更糟糕的换算系数。

    想象一下复杂的链式求导,二阶、三阶导数,链式法则和乘积法则,里面塞满了三角函数,却因为没用弧度而生成了一大堆不必要的级联换算常数。

  2. WCSTombs

    我觉得在某种程度上谨慎地同意这个观点,但在我看来,真正的答案是这取决于应用场景。如果你正在编写底层三角函数库,必须在两者中择一,那我并不觉得“转”一定比弧度胜出。

    我预计许多使用三角函数的系统,有时为了效率或作为通用情况的起点,会用到小角度近似。在这里使用泰勒级数是很自然的,即:

    cos(x) = 1 - x^2/2 + ...

    sin(x) = x - x^3/6 + ...

    如果你决定将所有三角运算都用“转”来表示,那么你就得改用:

    cos(2πt) = 1 - (2πt)^2/2 + ...

    sin(2πt) = (2πt) - (2πt)^3/6 + ...

    在这种情况下,如果你偶尔需要处理弧度,强行把所有东西都转成“转”会导致精度更低、效率更差。

    与此密切相关的是,如果你需要计算涉及三角函数的函数的导数(例如在数值优化中),最好直接用弧度。因为如果不这样,你施加的任何额外系数都会出现在导数表达式中,反正你到时候也得处理它们。

    基本上出于这个原因,从数学角度(远离计算机层面)来看,以弧度表示的三角函数显然是“正确”的惯例,因为基于弧度的三角函数导数表达起来太简单了。既然如此,如果我们必须选一种惯例……难道到处都用同一种东西不是更不容易混淆吗?话虽如此,那里还有一……

  3. mayoff

    这个问题在于,当我看到 π 时,我就知道我们在讨论角度;而当你用“转”时,那只是某个数字。也许在类型安全的语言里会好用些。

  4. traes

    与其考虑 sin()、cos() 和圆周运动,不如考虑沿正多边形的匀速运动及其在水平和垂直方向上的投影 hor() 和 ver(),这挺有趣的。

    你可以用完成一个周期所需的时间 T 来参数化运动,并考虑其在任意 t mod T 时刻的水平(或垂直)投影。

    这与 DFT(离散傅里叶变换)有关。随着正多边形顶点数的增加,我们将取极限得到 sin 和 cos。2π 会出现在匀速运动一个周期内覆盖的距离与投影运动幅度之比中。

  5. beeforpork

    Fortran 2023 标准引入了新的内部函数:

    “内部函数 ACOSPI、ASINPI、ATANPI、ATAN2PI、COSPI、SINPI 和 TANPI 是三角函数,其中角度以半圈(即 π 的倍数)指定。”

同日更多故事

2026-08-20