【COBOL学習|初心者向け】COBOLの組込関数でSIN/COSを使うとき、計算結果が合わない理由

なぜ重要か:計算誤差の罠を回避する

ベテランの現場でも時折見かけるのが、COBOLの組込関数(FUNCTION SINやFUNCTION COSなど)を使って計算した際、「値がどうもおかしい」というトラブルです。特に、設計図面や業務統計などで「30度」「90度」といった値をそのまま関数に放り込んでしまう初心者が多いのですが、これは大きな間違いです。このTipsを理解することで、意図した通りの正確な三角関数計算ができるようになります。

基礎知識:ラジアンと度数法の違い

数学には角度を表す単位が2つあります。私たちが普段使う「360度」で表す単位を「度数法(Degree)」と呼びます。一方、COBOLをはじめとする多くのプログラミング言語の数学関数が内部で期待しているのは「ラジアン(弧度法 / Radian)」という単位です。
ラジアンは「半径と同じ長さの弧を描くときの中心角」を1とする単位系で、180度がπ(約3.14159)ラジアンに相当します。COBOLの関数に度数法をそのまま渡すと、コンピュータはそれをラジアンとして処理するため、全く別次元の数値が返ってきてしまうのです。

実装/解決策:変換式を組み込む

正しい結果を得るためには、プログラム内で「度数法をラジアンに変換」する処理を挟む必要があります。
計算式は以下の通りです。
ラジアン = 度 × 3.1415926535 / 180
この変換を事前に行い、その結果を関数に渡すように実装しましょう。

サンプルプログラム

以下のコードは、30度をSIN関数で計算する例です。そのままコピー&ペーストして、コンパイル・実行してみてください。

IDENTIFICATION DIVISION.
PROGRAM-ID. TRIG-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.

  • 度数を保持する変数

01 DEGREE-VAL PIC 9(03) VALUE 30.

  • 変換後のラジアンを保持する変数

01 RADIAN-VAL PIC S9(09)V9(10).

  • 結果を保持する変数

01 RESULT-VAL PIC S9(09)V9(10).

  • 円周率(定数)

01 PI PIC S9(01)V9(10) VALUE 3.1415926535.

PROCEDURE DIVISION.
> 度数法からラジアンへの変換式
COMPUTE RADIAN-VAL = DEGREE-VAL PI / 180.

> 変換したラジアン値をSIN関数に渡す
COMPUTE RESULT-VAL = FUNCTION SIN(RADIAN-VAL).

DISPLAY “30度のサイン値は: ” RESULT-VAL.

STOP RUN.

応用・注意点:現場で役立つアドバイス

1. 精度の確保:PIの値は、使用する変数の桁数に合わせて十分な精度を確保してください。`3.14`だけで計算すると、大きな数値や複雑な計算で誤差が蓄積されます。
2. 変数定義の型:計算結果を受け取る変数は、小数点以下を保持できるよう必ず「V」を含む形式(固定小数点形式)で定義してください。整数型(PIC 9など)で受け取ると、結果が切り捨てられて「0」や「1」しか返ってこなくなります。
3. 逆関数の場合も同様:ASINやACOSといった逆関数を使う場合も、返却値はラジアンになります。度数法に戻したい場合は、逆に「180 / π」を掛ける必要があることを覚えておきましょう。

この「単位の変換」というひと手間が、正確なシステム開発の鍵となります。ぜひ覚えておいてください。

コメント

タイトルとURLをコピーしました