ラジアンより「ターン」が優れている理由

Turns are Better than Radians

ラジアンより「ターン」が優れている理由

円周率πやタウτを使う代わりに、角度を0から1の範囲で表す「ターン」を使う方が、コードが簡潔になり、計算も正確になる。三角関数の実装では、呼び出し側がπを掛け、ライブラリ側がそれを割り戻すという無駄が発生している。ターンを使えば、この無駄を省けるだけでなく、90度や180度などの一般的な角度を正確に表現できる。CUDAのsincospiのように、すでにターン対応の関数を持つライブラリもあり、移行は簡単だ。

ラジアンを使うのをやめてコードベース全体を管理してきた経験から言えるのは、ラジアンが恋しくなったことは一度もないということだ。
  1. kazinator

    ターンでは数学は絶対にうまくいかない。なぜなら、オイラーの公式 e^ix = cos x + i sin x が成り立たなくなるからだ。e 以外の底、具体的には B = e^(2π) ≈ 535.4916 を使うことになるが、これは d/dx e^x = e^x のような e の素晴らしい性質を持たない。

    自然対数の底が、それ自身の導関数となる指数関数を生み出し、それが上記のオイラーの公式の基礎にも現れるという優雅な事実は、ラジアンが特別であることを示している。それは、コンピュータにとっての2進法のようなものだ。

    自然対数がそれ自身の導関数であることは、実際、ラジアン基準の sin(x) の導関数が cos(x) になることなどと直接結びついている。他の単位に変えれば、2π よりもひどい変換係数の混乱が生じる。

    複雑な連鎖微分、2階・3階微分、連鎖律や積の法則を想像してみてほしい。すべて三角関数で埋め尽くされ、ラジアンを使わないせいで、無駄にカスケード状の変換定数が積み重なることになる。

  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. srean

    一周回ってみよう。

    すべては、sin と cos の呼び出しで頻繁に現れる 2π を τ に置き換えることから始まった。

    この投稿は、ラジアンを廃止して τ をなくすという最適化を提案している。そうすれば、頻繁で冗長なラジアンと度の変換をなくすことができる。

    私は言いたい、sin と cos 自体をなくしてしまおう!

    もちろん、これは大げさだ。しかし、角度を度・ラジアン・ターンのスカラーとしてではなく、(sin, cos) のタプルとして表せば、通常、三角関数の呼び出し回数を劇的に減らせる。有理多項式と平方根で十分だ。回転は、sin と cos を成分とする行列による線形変換であることを思い出そう。

    API としては不便かもしれないが、コードが頻繁に三角関数を呼ぶなら、内部で角度を sin と cos のタプルに変換してそのまま保持することを検討してほしい。

    (余談:私は半角のタプルを保持する方が好みだ。tan(θ/2) があると便利だ。そして、この投稿に何度もコメントしてしまったことを恥ずかしく思う。)

  4. mayoff

    私は自分のコードでは角度をターンで保存するのが好きだ。なぜなら(前述の通り)4分の1ターンが丸め誤差なく計算できるからだ。一方、例えば12分の1ターンが必要なら、角度を度で保存する方が良いかもしれない。度はすでに一般的だから。

    マイケル・スピヴァクは『Calculus』(第3版、p. 301)で、単位の選択は関数の性質であると考え、最初に sin° と sinʳ を定義し(その後 sin が sinʳ を意味することに落ち着く)、「sin x°」や「sin x radians」という表現は誤解を招くと述べている。『数 x は単なる数であり、それが「度である」とか「ラジアンである」という旗を掲げているわけではない』と。私はこの議論をあまり理解できない。なぜなら、科学や工学では常に量に単位を付けて扱うからだ。

  5. traes

    非常に大胆なタイトルだ! ターンは変化率を計算する必要が出るまで非常に便利だ。もちろん、d/dx sin(2πx) = 2π cos(2πx) だからだ。残念ながらこれは十分に一般的な問題なので、私はラジアンを使い続けるつもりだ。

  6. mattmcal

    私は物理学の学部生のときにこの考えをクラスメート数人に主張し、彼らも同意した。しかし、後に三角関数の導関数・積分に与える影響のために意見を変えた。

    一般的な周期関数には [0, 1) は良い定義域だ。しかし、円や球は幾何学的な対象であり、ラジアンやステラジアンは幾何学的に重要な単位で、一般的な目的に適している。

    Doom が興味深い代替表現を使っていたのを覚えている。角度を u16 の (2π / 65536) の倍数として表すものだ。固定小数点数は、精度が均一であるため、ゲームやシミュレーションでは良い選択となることがある。

  7. chabska

    問題は、三角関数が幾何学以外の多くの分野で使われていることだ。入力は常にユークリッド空間の点の周りの角度ではなく、周期信号の位相角かもしれない。ターンを取る代替の三角関数セットを作ることはできるが、バニラの三角関数をいじると多くの人を怒らせるだろう。

  8. jerf

    この会話全体を読んで、人々はこの実用的な影響をほとんど見落としていると感じる。つまり、自分の数学を「ターン」で好きなだけ書けるということだ。今すぐにでも何も妨げるものはない。ターンを取る sinT 関数を定義するのは簡単だ。他の関数についても同様だ。

    私はグラフィックスプログラミングをあまりやったことはないが、やったときは π ではなく τ を使った。皆さんは、すべての数学が完全に書き直されるような並行宇宙に入る必要があるかどうかを議論しているようだが、そんな必要はない。簡単だった。宇宙と衝突することはなかった。ただ「τ」を「2 * π」の代わりに使っただけだ。それだけだ。それで変換作業は終わりだ。「const TAU = 2 * PI;」と書けば、それで終わりだ。同様に、提案されているのは、「sin(2 * π * (1/4))」の代わりに、sinT を定義して「sinT(1/4)」と書くことだけだ。

    本当に、それだけだ。世界中のすべての数学ライブラリを書き直す必要はない。数学ライブラリがそれをサポートする必要さえない。これらは複雑なラッパーではない。導関数を取るために微積分全体をやり直す必要もない。さらに、度も同じ問題をすべて抱えており、私たちもよく使っている。度を取る三角関数のバリアントを持つことは珍しくなく、これはただの別のバリアントだ。数学ライブラリに入って、ターンに基づいていないものをすべて削除する必要はない。それを強制する必要もない。

この日のほかの記事

2026-08-20