第1章 導入──三角関数を“文化”として扱う理由
PLCで三角関数を使う場面は多いが、
その内部構造を理解する機会は意外と少ない。
本稿では、三角関数を「計算」ではなく
「構造」として扱う視点を提示する。
なんちゃってシリーズが大切にしてきたのは、
最小の構造で最大の意味を取り出すこと。
三角関数もまた、その思想に自然に属する。
第2章 ざっぱな構造──三角関数の全体像を一枚で掴む
三角関数は sin・cos・tan の三つに見えるが、
構造としては sin ひとつで十分である。
cos はシフト(+90°)、tan は割り算で導ける。
さらに、角度は象限ごとに整理でき、
0〜π/2 の範囲に折り返すことで
計算量を最小化できる。
本稿では、この“縮約”を中心に据える。
第3章 詳細な構造──DEGで整え、RADで波を描く
本稿の三角関数は、外界(DEG)と内界(RAD)を分けて扱う。
角度の整理は DEG のまま行い、波を描く計算だけを RAD で行う。
入力される θ_deg は 0〜360° の範囲にあるものとし、
まず象限を判定して折り返し角 α_deg(0〜90°)を作る。
この段階ではまだ π を使わない。誤差を入れないためである。
sin の本体となる計算は、α_deg を
α_rad = α_deg × (π / 180)
として弧度法に変換した後に行う。
こうして、角度の構造は DEG で整え、
波の計算は RAD で行うという二層構造が成立する。
第4章 実装前の思想──本体を最小化する設計哲学
本稿では、三角関数の“本体”を sin_base(α) のみとする。
0〜π/2 の範囲だけを扱い、
他のすべては構造から導く。
分岐を減らし、計算を減らし、
構造を最大限に活かす。
これはなんちゃってシリーズが
一貫して大切にしてきた設計思想である。
第5章 なんちゃって三角関数 ── πの文化圏に属するもの
三角関数は角度の計算ではない。
その本体は、円周を π で割りつけたときに現れる
“弧度法”という文化圏にある。
角度は入口にすぎず、波の言語としての三角関数は
πを母体とする世界で初めて意味を持つ。
だから、なんちゃって三角関数を作るとき、
私たちは自然と“なんちゃってπ”へ帰っていく。
πを近似し、円周を近似し、その上で波を描く。
そこに生まれる誤差は欠陥ではなく、この文化圏の風味である。
たとえば sin(π/2) は本来 1 になるが、
なんちゃってπを使えば π/2 もまた近似値となり、
sin(π/2) は 1 にならない。
その揺らぎこそが、このシリーズの遊び心である。
本章では、三角関数を“計算”ではなく“文化”として扱う。
πを母体とし、弧度法の上に波を描く。
その小さな癖やズレを、なんちゃってという名の自由として受け入れる。
■ sin の本体は、弧度法の上で展開される
弧度法の世界では、sin は 0 まわりで展開できる。
これは マクローリン展開 と呼ばれ、次のように表される。
$$
\sin x = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \cdots
$$
本稿では、このうち 最初の二つの項(3次・5次)だけ を用いた。
最小構造の近似式を採用する。
$$
\sin x \approx x - \frac{x^3}{6} + \frac{x^5}{120}
$$
これは sin の5次マクローリン多項式 であり、
波を描くための “なんちゃって三角関数” の本体となる。
■ コラム:アジアと弧度法──円を基準にする文化の源流
「アジアの技術文化は弧度法を自然に受け入れてきた」
この言い方には、いくつかの歴史的背景がある。
● インド数学:三角関数は“弦の幾何”から始まった
インドの古典三角法(Jyā, Koṭi-jyā)は、
角度ではなく「円の弦の長さ」を基準に定義されていた。
つまり、角度を数えるよりも、
円弧と弦の関係を直接扱う文化が最初から存在した。
● 中国数学:円周率研究は“円の割り付け”の文化
劉徽や祖沖之の円周率研究は、
円を細かく分割し、弧を扱うことで精度を上げていく手法だった。
ここでも主役は「度数」ではなく、
円そのものをどう割るかという発想だった。
● ヨーロッパとの対比:度数法文化圏
一方、ヨーロッパはバビロニア由来の60進法を継承し、
航海・天文学の伝統の中で「360°」が強く根付いた。
つまり、角度を数える文化が主流だった。
~~~~~~~~~~~~~~~~~~~~~
これらを並べると、
アジア圏では「角度よりも円弧を基準にする」
いわば 弧度法的な感覚が自然に育っていたと言える。
本編で語った“πの文化圏”という言葉は、
こうした歴史的背景の上に立っている。
第6章 象限フラグ A/B と境界点の扱い
象限判定は、角度 θ_deg を 1ワードのフラグ A/B に写像することで
分岐なしで処理できる。
A/B の割り当ては次のとおりとする。
第1象限:A=0, B=0(0°〜90°未満)
第2象限:A=1, B=0(90°〜180°未満)
第3象限:A=0, B=1(180°〜270°未満)
第4象限:A=1, B=1(270°〜360°未満)
境界点は次のように扱う。
0° → 第1象限(A=0, B=0)
90° → 第2象限(A=1, B=0)
180° → 第3象限(A=0, B=1)
270° → 第4象限(A=1, B=1)
360° → 第1象限(0°と同じ扱い)
この A/B を用いることで、折り返し角 α_deg は
分岐なしで次の式で求められる。
α_deg = | θ_deg − 180 ( A + B ) |
符号も A/B から決定できる。
sin符号 = +1(B=0), −1(B=1)
これにより、象限判定・折り返し角・符号処理を
すべて分岐なしで実装できる。
第7章 実装体系──なんちゃって三角関数のサブルーチン構造
本章では、第1〜6章で構築した思想・構造をもとに、
実際に PLC 上で動作する なんちゃって三角関数の実装体系 を示す。
本実装は、PLC編集画面のハードコピー(ラダー)をそのまま貼り付ける形式で提示する。
本章のサンプルコード一式(ZIP)は以下からダウンロードできます。
👉 [なんちゃって三角関数サンプルコード(ZIP)]
https://yenqoo.com/qiita/nancyaTriFN.zip
7.1 全体構成──三角関数のサブルーチン
本稿のなんちゃって三角関数は、
すべての演算をサブルーチン化し、
入力と出力はレジスタで受け渡す方式を採用する。
メイン処理の流れは次のとおり。
• 入力角度 θ_deg をレジスタにセット
• θ_deg をそのまま渡して Call SIN_ROUTINE
• θ_deg + 90° を渡して Call SIN_ROUTINE(→ cos)
• PLC純正の SIN/COS 命令も同時計算し、比較用に表示
• 入力刻みは0.1°(35°を入力するなら「350」と入力)
この構成により、
sin と cos を同じ本体で計算できる
という“なんちゃ三角”の思想がそのまま実装に落ちる。

7.2 サブルーチンの内部構造
サブルーチンは、
以下の 7 段階で構成される。
① 360°未満への正規化
入力角度 θ_deg が 360°以上の場合、
360°未満に正規化する。
• 360°は 0° と同じ扱い
• MOD 演算で実装

② A/B フラグの生成(象限判定)
入力角度 θ を 1ワード のフラグ A/B に写像する。
• A:折り返し方向 [DM14]
• B:符号(180°を跨いだか)[DM15]

③ 折り返し角 の生成(分岐なし)
A/B を使って 0〜90° の折り返し角を作る。

④ DEG → RAD(なんちゃって円周率+なんちゃって四捨五入)
本稿で使用する DEG→RAD 変換は、
第5章で述べた “なんちゃって円周率” と
“なんちゃって四捨五入(固定小数点)” を用いる。
• なんちゃって円周率 を使用(355/113 など)
• 小数5桁目で丸める(なんちゃって四捨五入 固定小数点)
• 浮動小数点に変換して近似計算へ渡す

⑤ 近似計算(5次マクローリン)
$$
\sin x \approx x - \frac{x^3}{6} + \frac{x^5}{120}
$$
• 浮動小数点演算
• 小数5桁目で丸める

⑥ 整数化と符号付与
• 最終値は整数化
• 符号は B から決定
• レジスタに結果を書き戻す(演算途中に自動で書かれる)

7.3 cos の計算──sin に +90°して同じルーチンを呼ぶ
cos は別ルーチンを持たず、
θ_deg + 90° を入力して サブルーチン を呼ぶだけ。

7.4 純正 sin/cos との比較
PLC標準の SIN/COS 命令を同時に実行し、
なんちゃ三角との誤差を比較できるようにする。

付録:サンプルコード(再掲)
記事内で使用したサンプルコード一式(ZIP)は以下から取得できます。
👉 [なんちゃ三角関数サンプルコード(ZIP)]
https://yenqoo.com/qiita/nancyaTriFN.zip
技術者は破天荒であれ。
この記事が、必要な人へ。
困っている人に、届きますように。
作者
圓空(えんくう)
https://yenqoo.com/spices/
https://yenqoo.com/monologue/
キーエンスPLCを中心に、
“技術 × 美学 × 遊び心” をテーマにした技術文化を発信しています。