【COBOL学習|豆知識】ベテランが教える「LOG10関数」活用術:桁数判定をスマートに実装しよう

導入:なぜ今、LOG10関数なのか

COBOLで業務システムを開発していると、「ある数値が何桁あるか調べたい」「特定の範囲内に収まっているか判定したい」という場面に遭遇します。力技で文字列変換を行ったり、繰り返し処理で割ったりしていませんか?そんな時、標準の組込関数であるLOG10(常用対数)関数を使えば、数行のコードをわずか1行のロジックに置き換えることができます。コードの可読性を高め、メンテナンス性を向上させるために、ぜひ使いこなしておきましょう。

基礎知識:常用対数とは何か

数学で習う「常用対数」とは、10を何乗すればその数値になるか、という値のことです。
例えば、100は10の2乗なのでLOG10(100)は「2」となります。1,000なら「3」です。
COBOLのLOG10関数は、引数に指定した数値のこの「10を底とする対数」を返します。
この性質を利用すれば、数値の「大きさのオーダー」を瞬時に把握できるというわけです。

実装・解決策:桁数判定への応用

プログラミングにおいて、LOG10関数の結果を整数化し、そこに1を加えることで、その数値の「桁数」を導き出すことができます。
例えば、150であればLOG10(150)は約2.17です。これを整数化(切り捨て)して2にし、1を足すと「3」となり、150が3桁の数値であることが分かります。

サンプルプログラム

以下のコードは、入力された数値が何桁かを判定する実用的な例です。コンパイルして動作を確認してみてください。

IDENTIFICATION DIVISION.
PROGRAM-ID. LOG-TEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM PIC 9(10) VALUE 12345.
01 WS-LOG-VAL COMP-2.
01 WS-DIGITS PIC 9(02).

PROCEDURE DIVISION.

  • 常用対数関数を使用してLOG10を計算

COMPUTE WS-LOG-VAL = FUNCTION LOG10(WS-NUM)

  • LOG10の結果の整数部に1を足すことで桁数を算出
  • FUNCTION INTEGERは小数点以下を切り捨てる関数です

COMPUTE WS-DIGITS = FUNCTION INTEGER(WS-LOG-VAL) + 1

DISPLAY “数値: ” WS-NUM
DISPLAY “桁数: ” WS-DIGITS

GOBACK.

応用・注意点:現場で陥りやすい罠

LOG10関数を利用する際に必ず注意すべき点が2つあります。

1. 負数とゼロの取り扱い:
対数の定義上、0や負の数を引数に指定すると計算エラー(浮動小数点例外)が発生します。必ず事前にIF文等で「IF WS-NUM > 0」といった判定を行い、エラーを回避するガード処理を記述してください。

2. 浮動小数点の精度:
LOG10関数の戻り値は通常COMP-2(倍精度浮動小数点型)です。非常に大きな数値や、精度の境界線にある数値の場合、わずかな誤差が生じることがあります。桁数判定のように整数部だけを扱う場合は問題になりにくいですが、厳密な計算に使用する場合は、最終的な計算結果に対してROUNDEDオプションや、微小な値を加味した補正が必要になるケースがあることを覚えておいてください。

現場の保守で「桁数計算」に出会ったら、ぜひこのスマートな関数を思い出してくださいね。

コメント

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