1. 導入:なぜCOBOLで逆三角関数が必要なのか?
事務処理がメインのCOBOLにおいて、数学関数はあまり使わないと思われがちです。しかし、基幹システムであっても「図形の面積計算」「物流の配送経路最適化」「工場の稼働シミュレーション」など、座標や角度を扱う場面は確実に存在します。これらを自力で計算しようとすると膨大な行数が必要になりますが、組込関数を使えば一瞬です。今回は、座標から角度を求める際に必須となる「逆三角関数」をマスターしましょう。
2. 基礎知識:逆三角関数とは?
通常、三角関数(SIN/COS/TAN)は「角度から値を求める」ものですが、逆三角関数はその逆で「値から角度(ラジアン)を求める」ものです。
ASIN(アークサイン):正弦の値から角度を求めます。
ACOS(アークコサイン):余弦の値から角度を求めます。
ATAN(アークタンジェント):正接の値から角度を求めます。
ここで重要なのは、戻り値が「度(Degree)」ではなく「ラジアン(Radian)」である点です。実務で使う場合は、後述する換算式が必要になることを覚えておいてください。
3. 実装・解決策
COBOLの組込関数は、`FUNCTION` キーワードに続けて関数名を記述します。重要なポイントは、計算結果を受け取る変数のデータ型です。小数点以下の精度を保つため、必ず COMPUTE 文を使用し、受け取り側の変数は USAGE IS COMP-2(浮動小数点型)を指定するのが現場の鉄則です。
4. サンプルプログラム
以下のコードは、ATANを使って直角三角形の2辺から角度を算出する例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. TRIG-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 計算精度を確保するためCOMP-2を使用
01 WS-VAL-X COMP-2.
01 WS-VAL-Y COMP-2.
01 WS-RAD COMP-2.
01 WS-DEG COMP-2.
01 WS-PI COMP-2 VALUE 3.141592653589793.
PROCEDURE DIVISION.
> 例:X=1, Y=1 の場合の角度を求める
MOVE 1.0 TO WS-VAL-X.
MOVE 1.0 TO WS-VAL-Y.
> ATANでラジアンを算出
COMPUTE WS-RAD = FUNCTION ATAN(WS-VAL-Y / WS-VAL-X).
> ラジアンを度に変換 (度 = ラジアン 180 / PI)
COMPUTE WS-DEG = WS-RAD 180 / WS-PI.
DISPLAY “計算結果(ラジアン): ” WS-RAD.
DISPLAY “計算結果(度): ” WS-DEG.
GOBACK.
5. 応用・注意点
現場で最も陥りやすい罠が「ゼロ除算」と「定義域」です。
・ゼロ除算:ATANを使う際、分母が0になるとプログラムが異常終了します。必ず除算前に分母が0でないかチェックを入れてください。
・定義域の制約:ASINとACOSは、引数に指定できる値が「-1から1の間」に限られます。それ以外の値を渡すと実行時エラーや意図しない結果を招くため、関数を呼ぶ前に必ず値の範囲チェックを行ってください。
また、複雑な計算を行う際は、計算途中のオーバーフローを防ぐためにも、常に計算結果を `COMP-2` 型で保持し、出力する直前に必要な形式へ編集するのがベテラン流の安全なコーディングです。

コメント