1. 導入:なぜATANの第2引数が必要なのか
COBOLで座標計算を行う際、単なるATAN(アークタンジェント)関数だけでは不十分なケースがあります。特に、第1象限から第4象限までを正確に判定し、座標平面上の角度を算出する場合、通常のATAN関数では戻り値が-PI/2からPI/2の範囲に限定され、象限の判別が困難です。実務において、地理情報システムや機械制御のロジックを扱う際、この「象限を考慮した角度計算」は避けて通れません。本稿では、ATAN関数の第2引数を活用し、煩雑な条件分岐なしで正確な方位角を求める方法を解説します。
2. 基礎知識:ATANとATAN2の仕組み
数学におけるATAN(y/x)は、xが負の場合や0の場合に演算不能になったり、象限が逆転したりする問題があります。これを解決するために、多くのプログラミング言語ではATAN2(y, x)という関数が用意されています。COBOL(2002規格以降のモダンな環境)では、ATAN関数に対して引数を2つ指定することで、このATAN2と同等の処理が行われます。
・第1引数(y):Y座標(垂直成分)
・第2引数(x):X座標(水平成分)
これにより、返り値は -PI から PI の範囲となり、座標平面上のどこに点が存在しても一意の角度が決定されます。
3. 実装と解決策
実装のポイントは、COMPUTE文で引数をカンマで区切って渡すだけです。戻り値は「ラジアン」単位となりますので、必要に応じて「180 / PI」を掛けて「度数法(Degree)」に変換します。これにより、方位角(0度から360度)への変換も容易になります。
4. サンプルプログラム
以下のコードは、指定した座標から角度を算出し、度数に変換する実用的な例です。
PROGRAM-ID. ATAN-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-X COMP-2. < X座標 >
01 WS-Y COMP-2. < Y座標 >
01 WS-RAD COMP-2. < 戻り値(ラジアン) >
01 WS-DEG COMP-2. < 変換後の度数 >
01 PI COMP-2 VALUE 3.14159265358979.
PROCEDURE DIVISION.
MOVE 10.0 TO WS-X.
MOVE 10.0 TO WS-Y.
< 2つの引数を指定して象限を考慮した角度計算を行う >
COMPUTE WS-RAD = FUNCTION ATAN(WS-Y, WS-X).
< ラジアンから度数法への変換 >
COMPUTE WS-DEG = WS-RAD 180 / PI.
DISPLAY “角度(ラジアン): ” WS-RAD.
DISPLAY “角度(度数): ” WS-DEG.
GOBACK.
5. 応用・注意点:現場で役立つアドバイス
注意点1:引数の順序
数学のATAN2は(y, x)の順ですが、慣れないうちは(x, y)と逆に書いてしまうミスが多発します。必ず「垂直成分(y)が先、水平成分(x)が後」と覚えてください。
注意点2:ゼロ除算の回避
ATAN2相当の関数を使う最大のメリットは、x=0のケース(垂直線上の点)でもプログラムが異常終了せず、正しくPI/2(90度)や-PI/2(-90度)を返してくれる点にあります。自前でIF文を書くより、この組込関数を積極的に利用することがバグを減らす最短の道です。
注意点3:精度の確認
COMP-2(浮動小数点型)を使用していますが、金融計算などで厳密な精度が求められる場合は、計算結果を適宜丸める(ROUNDED)などの処理を併用してください。

コメント