net cobolのサンプルコード 循環小数による誤差
記事内に広告を含む場合があります。

net cobolのサンプルコード 循環小数による誤差

net cobolのサンプルコード

net cobolのサンプルコード

net cobolでログイン画面を生成

net cobolでログイン画面
net COBOLって、どんな感じの言語なんでしょうか?サンプルコードを見ていきましょう。

IDENTIFICATION DIVISION.

PROGRAM-ID. LOGIN.

 

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

 

DATA DIVISION.
FILE SECTION.

 

WORKING-STORAGE SECTION.
01 USERNAME PIC X(8).
01 PASSWORD PIC X(8).

 

PROCEDURE DIVISION.
00-LOGIN.
DISPLAY "Username: ".
ACCEPT USERNAME.
DISPLAY "Password: ".
ACCEPT PASSWORD.

 

実行するとこうなります。

 

Username: john
Password: mypassword

 

COBOL(Common Business-Oriented Language)は、主にビジネス関連のアプリケーションを作成するために開発された高級プログラミング言語です。

 

COBOLは、他の言語と比べて古くて非効率な言語であり、複雑なプログラムを作成するのには向いていません。しかし、COBOLは非常に高い可読性を持ち、また可搬性も高いので、企業のプログラム開発においては今でも重要な役割を担っています。COBOLは、コンピューターが利用可能な演算子と機能を豊富に持つ他の言語(C、C ++、Javaなど)よりも複雑なビジネスプロセスを簡潔に実装できるように設計されています。

C言語で誤差がでるけど、COBOLでは誤差が出ないサンプルコード

C言語での誤差がCOBOLで出ない
けっこう有名な例として、C言語で0.01を1万回足しても100にならないという話があります。

 

参考)C言語でfloatの0.01を1万回たすと100にならないのは... - Yahoo!知恵袋

#include

 

int main(void){
double a = 0;
int i;
for(i=0;i<10000;i++){
a += 0.01;
}
printf("a=%f\n", a);
return 0;
}

 

実行するとこうなります。

 

a=99.999999

 

これは、C言語が内部で2進数を使っているためにおこります。0.01を2進数に変換すると、0.000110011001100110011...という無限に繰り返される小数になります。これを「循環小数」といいます。

 

つまり、2進数では表現できない10進数の数が存在するということですね。

 

以下のような値も循環小数になります。

 

  • 0.33
  • 0.14
  • 0.77
  • 0.25
  • 0.82

 

一方、COBOLでは、内部で十進数を使っているため、何事もなく正確な値が出てきます。

 

IDENTIFICATION DIVISION.
PROGRAM-ID. SUM-TEST.

 

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 COUNTER PIC 9(4) VALUE ZERO.
01 SUM PIC 9(7)V99 VALUE ZERO.

 

PROCEDURE DIVISION.
MAIN-PROGRAM.
PERFORM ADD-SUM 10000 TIMES
DISPLAY "SUM: " SUM
STOP RUN.

 

ADD-SUM.
ADD 0.01 TO SUM
ADD 1 TO COUNTER
IF COUNTER < 10000
PERFORM ADD-SUM
END-IF.

実行するとこう。

SUM: 100.00

 

「ただ、0.01を1万回足しただけだが?」という感じの当たり前の結果。

 

ちなみに、10進数を値を保持するCOBOLは、データを大量に扱うときのメモリ効率が悪いという欠点があります。メモリ上に大量の数値を展開して、一気にドン!と計算するような処理は苦手で、バッチ処理的な計算が前提ということですね。

 

科学技術計算などでは、誤差ありきで処理をおこなうため、2進数ベースの言語が主流になっています。金融系のお金の計算だけは、1円違えば大騒ぎになるため、未だにCOBOLが使われているんですね。
関連)COBOLの将来性と需要

 

まとめるとこう。

 

  • C言語では、2進数で表現できない数値を10進数で表現した場合に循環小数となり誤差が発生する可能性がある。
  • COBOLは内部で十進数を使っているため、循環小数自体が発生しない
  • 言語自体の仕様なので、容量や処理能力が向上してもこの問題は発生する