【COBOL 書き1-11-2】V とドットで小数点と小数を探ってみる〜なるおの実験室

🧩今日の学び
Vは小数点を表示する記号ではなく、計算上の小数位置を示す仮想小数点として使う。
・ドット付きのPIC項目は表示用であり、計算対象として使うとエラーや想定外の結果につながる。
・小数を正しく扱うには、計算用と表示用の項目を分け、必要な小数桁数まで設計する必要がある。

なるお)Vを使って、さっき小数点が表示されたわけだけど、計算用ってことは、表示用途では使えないってことす?

係)環境によってはそうだってことだ。前に言っただろ。

そのため、表示をするだけならドットでいい。こういう形だ。

01 A PIC 9(5).9.

しかし、ドットはあくまでも表示用途だから、それを数字として計算で使うことができない可能性が高い

ということから、表示用を計算に使ったらどうなるかを考えてみろ。

Vは計算用、ドットは表示用

な)考えた結果、どうにもこうにもなりませんでした。

係)考えろっての!

な)あはーん

…えーと…表示用を計算で使うんだから、適当に足し算してみるっぺか

📝 COBOL test.cob
DATA DIVISION.
WORKING-STORAGE SECTION.

01 A PIC 9(5).99 VALUE 1.01.
01 B PIC 9(5)V99 VALUE 1.01.

PROCEDURE DIVISION.
ADD 1 TO A.
DISPLAY A.

ADD 1 TO B.
DISPLAY B.
💻 ターミナル出力 実行結果
 error: 'A' is not a numeric name
   11 | PROCEDURE DIVISION.
   12 > ADD 1 TO A.
   13 | DISPLAY A.

ドット付き項目は数値として計算できない

ふむ…Aはnumericじゃないってエラーだから、.だったら計算できないってわけなのかな

だったらAの計算を消して、VのほうのBを通るようにして、こっちに計算を入れてっと…

📝 COBOL test.cob
DATA DIVISION.
WORKING-STORAGE SECTION.

01 A PIC 9(5).99 VALUE 1.01.
01 B PIC 9(5)V99 VALUE 1.01.

PROCEDURE DIVISION.
DISPLAY A.

ADD 1 TO B.
DISPLAY B.
💻 ターミナル出力 実行結果
00001.01
00002.01

おーちゃんと計算できたっと

だから….だと計算できなくて表示用ってだけで、Vだと計算できるって結果になる

って話でいいっすか?

係)いいぞ。

な)ほほー、ちなみに.とかVのあとって9999と続けるだけでなく、9(4)とかにまとめることもできますの?

係)できるぞ。

な)ほーほー、だったら、表示形式をまとめてみちゃうとこんな感じかな?

📝 COBOL test.cob
 5 | 01 A PIC 9(5) VALUE 5.01.
 6 | 01 B PIC 9(5)V9 VALUE 5.01.
 7 | 01 C PIC 9(5)V99 VALUE 5.01.
 8 | 01 D PIC 9(5)V9(2) VALUE 5.01.
 9 | 01 E PIC 9(5).9 VALUE 5.01.
10 | 01 F PIC 9(5).99 VALUE 5.01.
11 | 01 G PIC 9(5).9(2) VALUE 5.01.

これをDISPLAYで表示させると…

小数点以下の桁数が足りないと警告になる

💻 ターミナル出力 実行結果
test2.cob:7: warning: value size exceeds data size [-Wothers]
    5 | WORKING-STORAGE SECTION.
    6 | 
    7 > 01 A PIC 9(5) VALUE 5.01.
    8 | 01 B PIC 9(5)V9 VALUE 5.01.
    9 | 01 C PIC 9(5)V99 VALUE 5.01.

test2.cob:8: warning: value size exceeds data size [-Wothers]
・・・
test2.cob:11: warning: value size exceeds data size [-Wothers]
・・・

むむ?データサイズ…?

係)わかるか?

な)うーん…

7 | 01 A PIC 9(5) VALUE 5.01.
8 | 01 B PIC 9(5)V9 VALUE 5.01.
11 | 01 E PIC 9(5).9 VALUE 5.01.

この3つで、データサイズが超えてると…

…あ、小数の桁が足りないってこと?

係)そうだな。

値が5.01と小数第二位まであるのに、この3つは小数第二位の桁が無いからだ(Aは小数桁ゼロ、B・Eは第一位まで)。

表示用と計算用の変数は分けて考える

な)ふんむふんむ

ってことは、計算用と表示用の変数は分けなきゃならないってことっすよね?

係)それでOKだ。

な)おー素晴らしき推察力!

係)ちなみに、今のコードを実行してみろ。

📝 COBOL sample.cob
  1IDENTIFICATION DIVISION.
  2PROGRAM-ID. NARUO.
  3
  4DATA DIVISION.
  5WORKING-STORAGE SECTION.
  6
  701 A PIC 9(5) VALUE 5.01.
  801 B PIC 9(5)V9 VALUE 5.01.
  901 C PIC 9(5)V99 VALUE 5.01.
 1001 D PIC 9(5)V9(2) VALUE 5.01.
 1101 E PIC 9(5).9 VALUE 5.01.
 1201 F PIC 9(5).99 VALUE 5.01.
 1301 G PIC 9(5).9(2) VALUE 5.01.
 14
 15PROCEDURE DIVISION.
 16DISPLAY A.
 17DISPLAY B.
 18DISPLAY C.
 19DISPLAY D.
 20DISPLAY E.
 21DISPLAY F.
 22DISPLAY G.
 23
 24STOP RUN.
 25

な)ほ?

んだば、実行…っと

💻 ターミナル出力 実行結果
00005
00005.0
00005.01
00005.01
00005.0
00005.01
00005.01

あ、いけた。

って、桁が足りないのは切り捨てされちゃってる…これだと桁が足りないとわけわからなくなるじゃないのね。

係)正確には、桁が足りないため、警告が出て、指定桁に収まる形で扱われたといった方が正しいな。

必ず切り捨てられるかどうかは…

な)環境によるんでしょ!もう、おじいちゃん、それさっきも言ったから!

係)うるさいわ!

な)あ、そういやさっき、Vが無いと小数を扱えないっていってたけど、計算もしないんすか?

係)良い考え方だ。それもやってみろ。

な)むい

📝 COBOL sample.cob
  1IDENTIFICATION DIVISION.
  2PROGRAM-ID. NARUO.
  3
  4DATA DIVISION.
  5WORKING-STORAGE SECTION.
  6
  701 A PIC 9(5) VALUE 5.01.
  801 B PIC 9(5)V9 VALUE 5.01.
  901 C PIC 9(5)V99 VALUE 5.01.
 10
 11PROCEDURE DIVISION.
 12ADD 0.99 TO A.
 13ADD 0.99 TO B.
 14ADD 0.99 TO C.
 15
 16DISPLAY A.
 17DISPLAY B.
 18DISPLAY C.
 19
 20STOP RUN.
💻 ターミナル出力 実行結果
00005
00005.9
00006.00

あ、桁足りないのは計算しないでやんの

おむすび

係)というわけだ。

つまり、最初の設計が重要だって話だぞ。

な)説明がまわりくど!

係)うるさいな。

お前は一つ一つ泥臭くやっていくのがお似合いなんだよ。

な)スマート路線で売り込んでいきたいんですって!

係)スマートの要素を一つも持ち合わせてないやつに言われても説得力がないだろが!

な)きぃ!

(続く)

係長のワンポイント

Vは小数点ではない。
本当は「ここに小数点があるものとして計算しろ」という設計情報だ。
よくある誤解はドットと同じ感覚で使うことだが、ドットは表示用、Vは計算用で役割が違う。
だから表示形式の項目を計算に使うとエラーになったり、期待しない結果になる。
その結果、小数桁不足や計算誤差ではなく、そもそもの項目設計が問題になる。
COBOLは値を見る言語ではなく、データ項目の役割を設計する言語だ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA