<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>実践編 on 思いつきそうで思いつかなくていたときに</title><link>https://blog.fuga.jp/tags/%E5%AE%9F%E8%B7%B5%E7%B7%A8/</link><description>Recent content in 実践編 on 思いつきそうで思いつかなくていたときに</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><copyright>Copyright(c) 2022-2025 SATO Daisuke. All rights reserved.</copyright><lastBuildDate>Tue, 22 Sep 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://blog.fuga.jp/tags/%E5%AE%9F%E8%B7%B5%E7%B7%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>COBOL を手元で動かす — 0.1 + 0.2 が正確に 0.3 になる十進演算を GnuCOBOL で確かめる（古今東西プログラミング言語紹介 実践編）</title><link>https://blog.fuga.jp/posts/2026-09-22-kokon-tozai-cobol/</link><pubDate>Tue, 22 Sep 2026 00:00:00 +0900</pubDate><guid>https://blog.fuga.jp/posts/2026-09-22-kokon-tozai-cobol/</guid><description>&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/APSv_t7tR_Q" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;この記事は、動画の書き起こしではなく、動画の元になった実験環境を軸にした実践編です。読み終えると、コンテナ1つで GnuCOBOL 3.2.0 の環境に入り、COBOL の Hello World、金額の桁編集、そして「同じ 0.1 + 0.2 が十進と二進で違う答えになる」対比までを、手元のコマンド数本で再現できるようになります。&lt;/p&gt;
&lt;h2 id="はじめに"&gt;&lt;a href="#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab" class="header-anchor"&gt;&lt;/a&gt;はじめに
&lt;/h2&gt;&lt;p&gt;COBOL は名前を聞いたことがあっても、実際にコンパイルして動かした人は多くないはずです。古い言語だから資料館で眺めるもの、という扱いになりがちですが、いまは &lt;a class="link" href="https://gnucobol.sourceforge.io/" target="_blank" rel="noopener"
 &gt;GnuCOBOL&lt;/a&gt; という自由なコンパイラがあり、Debian の &lt;code&gt;apt&lt;/code&gt; で入るので、試すこと自体は難しくありません。&lt;/p&gt;
&lt;p&gt;この記事の結論を先に置きます。COBOL の面白さは構文の古さではなく、 &lt;strong&gt;金額を扱うための機能が言語の側に入っている&lt;/strong&gt; ことです。桁を型として書く &lt;code&gt;PIC&lt;/code&gt; 句と、十進で計算する演算がその中心にあり、後者は二進浮動小数点との対比を1本のプログラムで見られます。&lt;/p&gt;
&lt;h2 id="1-環境を用意する"&gt;&lt;a href="#1-%e7%92%b0%e5%a2%83%e3%82%92%e7%94%a8%e6%84%8f%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;1. 環境を用意する
&lt;/h2&gt;&lt;p&gt;実験環境は &lt;a class="link" href="https://github.com/densuke/lang-playground/tree/main/20260922-COBOL" target="_blank" rel="noopener"
 &gt;lang-playground リポジトリの 20260922-COBOL ディレクトリ&lt;/a&gt; にまとまっています。処理系は &lt;strong&gt;GnuCOBOL 3.2.0&lt;/strong&gt; で、Debian trixie の &lt;code&gt;apt&lt;/code&gt; で入ります。Dockerfile は &lt;code&gt;debian:trixie-slim&lt;/code&gt; を土台に &lt;code&gt;gnucobol&lt;/code&gt; パッケージを入れるだけの構成です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ./run.sh cobc --version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cobc (GnuCOBOL) 3.2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Copyright (C) 2023 Free Software Foundation, Inc.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;ライセンスは、コンパイラ本体が GPLv3、ランタイムライブラリが LGPLv3 です。公式サイトは &lt;code&gt;gnucobol.sourceforge.io&lt;/code&gt; にあります。&lt;/p&gt;
&lt;p&gt;リポジトリの中身は小さく、読むべきファイルは次の4種類に絞れます。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;ファイル&lt;/th&gt;
					&lt;th&gt;内容&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Dockerfile&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;debian:trixie-slim&lt;/code&gt; に &lt;code&gt;gnucobol&lt;/code&gt; を入れるだけの環境定義&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;run.sh&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;コンテナランタイムを探してイメージをビルドし、コンテナを起動する入口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;demo/*.cob&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;この記事で動かす3本のプログラム（&lt;code&gt;basics&lt;/code&gt; / &lt;code&gt;decimal&lt;/code&gt; / &lt;code&gt;freeform&lt;/code&gt;）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;demo/demo.sh&lt;/code&gt; / &lt;code&gt;demo/demo-feature.sh&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;動画で流した手順を並べた補助スクリプト&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;1コマンドで環境に入る入口が &lt;code&gt;run.sh&lt;/code&gt; です。&lt;code&gt;container&lt;/code&gt;（macOS 26 の Apple container）、&lt;code&gt;docker&lt;/code&gt;、&lt;code&gt;podman&lt;/code&gt; のいずれかがあれば動きます。引数なしで実行するとコンテナ内のシェルに入り、リポジトリの &lt;code&gt;demo&lt;/code&gt; ディレクトリがコンテナの &lt;code&gt;/work&lt;/code&gt; にマウントされます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ./run.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;run.sh&lt;/code&gt; は実行のたびにイメージをビルドしますが、成功したときはログを出さず、失敗したときだけ標準エラーへ出力します。以降の実行結果はすべて、この節の環境（GnuCOBOL 3.2.0 / Debian trixie）で得られたものとして、リポジトリの README に記録されている出力をそのまま載せています。&lt;/p&gt;
&lt;h2 id="2-まず動かす"&gt;&lt;a href="#2-%e3%81%be%e3%81%9a%e5%8b%95%e3%81%8b%e3%81%99" class="header-anchor"&gt;&lt;/a&gt;2. まず動かす
&lt;/h2&gt;&lt;p&gt;最初の1本は &lt;code&gt;demo/basics.cob&lt;/code&gt; です。Hello World に、金額の計算と表示を足した構成になっています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cobol" data-lang="cobol"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;IDENTIFICATION&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DIVISION&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;PROGRAM-ID&lt;/span&gt;. &lt;span style="color:#00d3d0"&gt;BASICS&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DATA&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DIVISION&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;WORKING-STORAGE&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;SECTION&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#00bcff"&gt;01 &lt;/span&gt;&lt;span style="color:#00d3d0"&gt;WS-PRICE&lt;/span&gt; &lt;span style="color:#6ae4b9"&gt;PIC 9(5)V99&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;VALUE&lt;/span&gt; &lt;span style="color:#00bcff"&gt;1980&lt;/span&gt;.&lt;span style="color:#00bcff"&gt;50&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#00bcff"&gt;01 &lt;/span&gt;&lt;span style="color:#00d3d0"&gt;WS-QTY&lt;/span&gt; &lt;span style="color:#6ae4b9"&gt;PIC 9(3) &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;VALUE&lt;/span&gt; &lt;span style="color:#00bcff"&gt;3&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#00bcff"&gt;01 &lt;/span&gt;&lt;span style="color:#00d3d0"&gt;WS-TOTAL&lt;/span&gt; &lt;span style="color:#6ae4b9"&gt;PIC 9(7)V99&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;VALUE&lt;/span&gt; ZERO.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#00bcff"&gt;01 &lt;/span&gt;&lt;span style="color:#00d3d0"&gt;WS-PRINT&lt;/span&gt; &lt;span style="color:#6ae4b9"&gt;PIC ZZZ,ZZZ.99&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;PROCEDURE&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DIVISION&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DISPLAY &lt;/span&gt;&lt;span style="color:#79a8ff"&gt;&amp;#34;Hello, World!&amp;#34;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;COMPUTE&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-TOTAL&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;=&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-PRICE&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;*&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-QTY&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DISPLAY &lt;/span&gt;&lt;span style="color:#79a8ff"&gt;&amp;#34;RAW : &amp;#34;&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-TOTAL&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;MOVE&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-TOTAL&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;TO&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-PRINT&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DISPLAY &lt;/span&gt;&lt;span style="color:#79a8ff"&gt;&amp;#34;GOKEI : &amp;#34;&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-PRINT&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;STOP&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;RUN&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再現手順は次の1行です。&lt;code&gt;cobc -x&lt;/code&gt; が実行ファイルを作り、それを &lt;code&gt;/work&lt;/code&gt; の中で実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ./run.sh bash -c &amp;#39;cobc -x /work/basics.cob &amp;amp;&amp;amp; cd /work &amp;amp;&amp;amp; ./basics&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hello, World!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RAW : 0005941.50
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GOKEI : 5,941.50
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;対応関係を書いておきます。&lt;code&gt;DISPLAY &amp;quot;Hello, World!&amp;quot;&lt;/code&gt; が1行目、&lt;code&gt;WS-TOTAL&lt;/code&gt;（&lt;code&gt;PIC 9(7)V99&lt;/code&gt;）をそのまま表示したのが &lt;code&gt;RAW&lt;/code&gt; の行、それを表示用の &lt;code&gt;WS-PRINT&lt;/code&gt;（&lt;code&gt;PIC ZZZ,ZZZ.99&lt;/code&gt;）に &lt;code&gt;MOVE&lt;/code&gt; してから表示したのが &lt;code&gt;GOKEI&lt;/code&gt; の行です。1980.50 × 3 = 5941.50 が、生の値では先頭ゼロ付きのまま、表示用ではカンマ付きで出ています。&lt;/p&gt;
&lt;p&gt;コードを1行ずつ読むと、次のようになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WS-PRICE&lt;/code&gt; は &lt;code&gt;PIC 9(5)V99&lt;/code&gt; で、初期値は &lt;code&gt;VALUE 1980.50&lt;/code&gt; です。整数5桁と小数2桁を持ちます&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WS-QTY&lt;/code&gt; は &lt;code&gt;PIC 9(3)&lt;/code&gt; で、初期値は &lt;code&gt;VALUE 3&lt;/code&gt; です&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WS-TOTAL&lt;/code&gt; は &lt;code&gt;PIC 9(7)V99&lt;/code&gt; で、初期値は &lt;code&gt;VALUE ZERO&lt;/code&gt; です。計算結果を受ける入れ物です&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WS-PRINT&lt;/code&gt; は &lt;code&gt;PIC ZZZ,ZZZ.99&lt;/code&gt; で、値を持たない表示専用の編集項目です&lt;/li&gt;
&lt;li&gt;&lt;code&gt;COMPUTE WS-TOTAL = WS-PRICE * WS-QTY.&lt;/code&gt; が計算、&lt;code&gt;STOP RUN.&lt;/code&gt; がプログラムの終了です&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文の終わりにはピリオドが付きます。COBOL では、データを宣言する DATA DIVISION と、処理を書く PROCEDURE DIVISION が分かれているので、「何を入れる箱か」と「何をするか」を別々に読めます。&lt;/p&gt;
&lt;p&gt;動画の前半で流した順序を、そのまま追うこともできます。&lt;code&gt;demo/demo.sh&lt;/code&gt; は次の4ステップを順に実行するスクリプトです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ./run.sh bash /work/demo.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;中身は &lt;code&gt;cobc --version | head -2&lt;/code&gt;、&lt;code&gt;sed -n '5,8p' basics.cob&lt;/code&gt;（&lt;code&gt;PIC&lt;/code&gt; 句の並んだ5〜8行目を表示）、&lt;code&gt;cobc -x basics.cob&lt;/code&gt;、&lt;code&gt;./basics&lt;/code&gt; の順です。各ステップの前後には待ち時間が入っているので、動画向けに間を取ったスクリプトだと考えてください。&lt;/p&gt;
&lt;p&gt;処理系のコンパイル方法は &lt;a class="link" href="https://gnucobol.sourceforge.io/doc/gnucobol.html" target="_blank" rel="noopener"
 &gt;GnuCOBOL の公式ドキュメント&lt;/a&gt; にまとまっています。この記事で使うのは、実行ファイルを作る &lt;code&gt;cobc -x&lt;/code&gt; と、後の章で使う &lt;code&gt;-free&lt;/code&gt; の2つだけです。&lt;/p&gt;
&lt;h2 id="3-言語の骨格"&gt;&lt;a href="#3-%e8%a8%80%e8%aa%9e%e3%81%ae%e9%aa%a8%e6%a0%bc" class="header-anchor"&gt;&lt;/a&gt;3. 言語の骨格
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;basics.cob&lt;/code&gt; を上から見ると、COBOL はプログラムを &lt;strong&gt;DIVISION（部）&lt;/strong&gt; に分けて書く言語だと分かります。役割は次のとおりです。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;DIVISION&lt;/th&gt;
					&lt;th&gt;役割&lt;/th&gt;
					&lt;th&gt;basics.cob での有無&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;IDENTIFICATION&lt;/td&gt;
					&lt;td&gt;プログラム名などの識別情報&lt;/td&gt;
					&lt;td&gt;あり（&lt;code&gt;PROGRAM-ID. BASICS.&lt;/code&gt;）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ENVIRONMENT&lt;/td&gt;
					&lt;td&gt;動かす計算機やファイルの環境&lt;/td&gt;
					&lt;td&gt;使っていない&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DATA&lt;/td&gt;
					&lt;td&gt;使うデータの定義&lt;/td&gt;
					&lt;td&gt;あり（&lt;code&gt;WORKING-STORAGE SECTION.&lt;/code&gt; 以下）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;PROCEDURE&lt;/td&gt;
					&lt;td&gt;実際の処理&lt;/td&gt;
					&lt;td&gt;あり（&lt;code&gt;DISPLAY&lt;/code&gt; &lt;code&gt;COMPUTE&lt;/code&gt; &lt;code&gt;MOVE&lt;/code&gt; &lt;code&gt;STOP RUN&lt;/code&gt;）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この記事のプログラムは、どれも ENVIRONMENT DIVISION を省いた3部構成です。各 DIVISION の詳しい書き方は、GnuCOBOL の&lt;a class="link" href="https://gnucobol.sourceforge.io/doc/gnucobol.html" target="_blank" rel="noopener"
 &gt;公式ドキュメント&lt;/a&gt;を参照してください。&lt;/p&gt;
&lt;p&gt;データの定義は &lt;code&gt;PIC&lt;/code&gt; 句で桁を型として書きます。&lt;code&gt;PIC 9(5)V99&lt;/code&gt; は整数5桁と小数2桁で、&lt;code&gt;V&lt;/code&gt; は小数点の位置を示す記号です。&lt;code&gt;PIC ZZZ,ZZZ.99&lt;/code&gt; は表示用の編集項目で、桁区切りのカンマが自動で入り、先頭のゼロが空白になります。&lt;code&gt;01&lt;/code&gt; で始まる行はデータ項目の宣言で、&lt;code&gt;WORKING-STORAGE SECTION.&lt;/code&gt; の下に並びます。&lt;code&gt;basics.cob&lt;/code&gt; の4つの項目は、どれも &lt;code&gt;01&lt;/code&gt; の階層番号を持っています。&lt;/p&gt;
&lt;p&gt;もう1つ、目に見える作法が &lt;strong&gt;桁位置&lt;/strong&gt; です。&lt;code&gt;basics.cob&lt;/code&gt; の各行は、行頭に空白が並んでいます。COBOL は 80 桁のパンチカードが出発点で、何桁目に何を書くかが決まっています。1-6 桁目が通し番号、7 桁目が標識、8-11 桁目が Area A、12-72 桁目が Area B です。&lt;code&gt;IDENTIFICATION DIVISION.&lt;/code&gt; や &lt;code&gt;01&lt;/code&gt; が 8 桁目から始まり、&lt;code&gt;DISPLAY&lt;/code&gt; などの文が 12 桁目から始まっているのは、この桁割りに従っているためです。GnuCOBOL の既定はこの固定形式なので、コードをコピーするときはインデントを崩さないようにしてください。&lt;/p&gt;
&lt;p&gt;桁を気にせず書ける形式が別にあり、それは第5章で試します。&lt;/p&gt;
&lt;h2 id="4-見せ場--十進演算と二進浮動小数点の対比"&gt;&lt;a href="#4-%e8%a6%8b%e3%81%9b%e5%a0%b4--%e5%8d%81%e9%80%b2%e6%bc%94%e7%ae%97%e3%81%a8%e4%ba%8c%e9%80%b2%e6%b5%ae%e5%8b%95%e5%b0%8f%e6%95%b0%e7%82%b9%e3%81%ae%e5%af%be%e6%af%94" class="header-anchor"&gt;&lt;/a&gt;4. 見せ場 — 十進演算と二進浮動小数点の対比
&lt;/h2&gt;&lt;p&gt;この記事でいちばん見てほしい場所です。&lt;code&gt;demo/decimal.cob&lt;/code&gt; は、同じ 0.1 + 0.2 を2通りの方法で計算します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cobol" data-lang="cobol"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;IDENTIFICATION&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DIVISION&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;PROGRAM-ID&lt;/span&gt;. &lt;span style="color:#00d3d0"&gt;DECIMAL-TEST&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DATA&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DIVISION&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;WORKING-STORAGE&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;SECTION&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#00bcff"&gt;01 &lt;/span&gt;&lt;span style="color:#00d3d0"&gt;WS-A&lt;/span&gt; &lt;span style="color:#6ae4b9"&gt;PIC 9V9(18)&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;VALUE&lt;/span&gt; &lt;span style="color:#00bcff"&gt;0&lt;/span&gt;.&lt;span style="color:#00bcff"&gt;1&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#00bcff"&gt;01 &lt;/span&gt;&lt;span style="color:#00d3d0"&gt;WS-B&lt;/span&gt; &lt;span style="color:#6ae4b9"&gt;PIC 9V9(18)&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;VALUE&lt;/span&gt; &lt;span style="color:#00bcff"&gt;0&lt;/span&gt;.&lt;span style="color:#00bcff"&gt;2&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#00bcff"&gt;01 &lt;/span&gt;&lt;span style="color:#00d3d0"&gt;WS-SUM&lt;/span&gt; &lt;span style="color:#6ae4b9"&gt;PIC 9V9(18)&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;VALUE&lt;/span&gt; ZERO.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#00bcff"&gt;01 &lt;/span&gt;&lt;span style="color:#00d3d0"&gt;WS-FA&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;USAGE&lt;/span&gt; &lt;span style="color:#6ae4b9"&gt;COMP-2&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;VALUE&lt;/span&gt; &lt;span style="color:#00bcff"&gt;0&lt;/span&gt;.&lt;span style="color:#00bcff"&gt;1&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#00bcff"&gt;01 &lt;/span&gt;&lt;span style="color:#00d3d0"&gt;WS-FB&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;USAGE&lt;/span&gt; &lt;span style="color:#6ae4b9"&gt;COMP-2&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;VALUE&lt;/span&gt; &lt;span style="color:#00bcff"&gt;0&lt;/span&gt;.&lt;span style="color:#00bcff"&gt;2&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#00bcff"&gt;01 &lt;/span&gt;&lt;span style="color:#00d3d0"&gt;WS-FSUM&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;USAGE&lt;/span&gt; &lt;span style="color:#6ae4b9"&gt;COMP-2&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;VALUE&lt;/span&gt; ZERO.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#00bcff"&gt;01 &lt;/span&gt;&lt;span style="color:#00d3d0"&gt;WS-SHOW&lt;/span&gt; &lt;span style="color:#6ae4b9"&gt;PIC 9V9(18)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;PROCEDURE&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DIVISION&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;COMPUTE&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-SUM&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;=&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-A&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;+&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-B&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DISPLAY &lt;/span&gt;&lt;span style="color:#79a8ff"&gt;&amp;#34;COBOL 10進 : &amp;#34;&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-SUM&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;COMPUTE&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-FSUM&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;=&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-FA&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;+&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-FB&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;MOVE&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-FSUM&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;TO&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-SHOW&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DISPLAY &lt;/span&gt;&lt;span style="color:#79a8ff"&gt;&amp;#34;2進浮動小数: &amp;#34;&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-SHOW&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; &lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;STOP&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;RUN&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;PIC 9V9(18)&lt;/code&gt; は整数1桁・小数18桁の十進の項目で、&lt;code&gt;WS-A&lt;/code&gt; &lt;code&gt;WS-B&lt;/code&gt; &lt;code&gt;WS-SUM&lt;/code&gt; がこれです。&lt;code&gt;USAGE COMP-2&lt;/code&gt; は二進倍精度で、&lt;code&gt;WS-FA&lt;/code&gt; &lt;code&gt;WS-FB&lt;/code&gt; &lt;code&gt;WS-FSUM&lt;/code&gt; がこれです。前半の &lt;code&gt;COMPUTE WS-SUM = WS-A + WS-B&lt;/code&gt; が十進の足し算、後半の &lt;code&gt;COMPUTE WS-FSUM = WS-FA + WS-FB&lt;/code&gt; が二進の足し算で、二進の結果は18桁の表示用項目 &lt;code&gt;WS-SHOW&lt;/code&gt; に &lt;code&gt;MOVE&lt;/code&gt; してから表示しています。&lt;/p&gt;
&lt;p&gt;7つの項目を整理しておきます。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;項目&lt;/th&gt;
					&lt;th&gt;型&lt;/th&gt;
					&lt;th&gt;役割&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;WS-A&lt;/code&gt; / &lt;code&gt;WS-B&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;PIC 9V9(18)&lt;/code&gt;（十進）&lt;/td&gt;
					&lt;td&gt;0.1 と 0.2&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;WS-SUM&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;PIC 9V9(18)&lt;/code&gt;（十進）&lt;/td&gt;
					&lt;td&gt;十進の足し算の結果&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;WS-FA&lt;/code&gt; / &lt;code&gt;WS-FB&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;USAGE COMP-2&lt;/code&gt;（二進倍精度）&lt;/td&gt;
					&lt;td&gt;0.1 と 0.2&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;WS-FSUM&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;USAGE COMP-2&lt;/code&gt;（二進倍精度）&lt;/td&gt;
					&lt;td&gt;二進の足し算の結果&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;WS-SHOW&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;PIC 9V9(18)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;二進の結果を18桁で表示するための項目&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;比較が公平になるように、どちらも &lt;code&gt;VALUE 0.1&lt;/code&gt; と &lt;code&gt;VALUE 0.2&lt;/code&gt; という同じ初期値から始めています。違うのは型だけです。&lt;/p&gt;
&lt;p&gt;再現手順と結果は次のとおりです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ./run.sh bash -c &amp;#39;cobc -x /work/decimal.cob &amp;amp;&amp;amp; cd /work &amp;amp;&amp;amp; ./decimal&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;COBOL 10進 : 0.300000000000000000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2進浮動小数: 0.299999999999999933
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;1行目が &lt;code&gt;PIC 9V9(18)&lt;/code&gt; の十進、2行目が &lt;code&gt;USAGE COMP-2&lt;/code&gt; の二進倍精度の結果です。同じプログラムの中で同じ 0.1 + 0.2 を計算させて、GnuCOBOL 3.2.0 では &lt;strong&gt;十進は正確に 0.3 になり&lt;/strong&gt; 、二進は 0.299999999999999933 と表示されました。&lt;/p&gt;
&lt;p&gt;動画の後半で流した手順も、&lt;code&gt;demo/demo-feature.sh&lt;/code&gt; として残っています。&lt;code&gt;grep -n 'WS-A \|WS-FA ' decimal.cob&lt;/code&gt; で十進と二進の宣言を並べて見せ、&lt;code&gt;cobc -x decimal.cob&lt;/code&gt; でコンパイルし、&lt;code&gt;grep -n 'COMPUTE' decimal.cob&lt;/code&gt; で2つの計算式を見せてから &lt;code&gt;./decimal&lt;/code&gt; を実行する、という順序です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ./run.sh bash /work/demo-feature.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;なぜこうなるのか。二進浮動小数点では、多くの十進の分数を正確に表すことができず、近似値が格納されます。これは COBOL に固有の事情ではなく、二進浮動小数点を使う言語に共通の性質で、Python 公式チュートリアルの&lt;a class="link" href="https://docs.python.org/3/tutorial/floatingpoint.html" target="_blank" rel="noopener"
 &gt;Floating-Point Arithmetic: Issues and Limitations&lt;/a&gt; でも同じことが説明されています。0.1 も 0.2 も十進では有限の桁数ですが、二進では有限の桁で表せないため、二進浮動小数点の型を選んだ時点で近似値になります。金額を扱う用途では、十進のまま計算できることがそのまま利点になります。&lt;/p&gt;
&lt;p&gt;ここで注意したいのは、この記事が示しているのは「GnuCOBOL 3.2.0 でこの2つの項目を使ったとき」の結果だという点です。二進側の 0.299999999999999933 は、リポジトリの README が記録している実行環境で得られた出力です。&lt;code&gt;COMPUTE&lt;/code&gt; で足した結果を &lt;code&gt;PIC 9V9(18)&lt;/code&gt; の &lt;code&gt;WS-SHOW&lt;/code&gt; に &lt;code&gt;MOVE&lt;/code&gt; して表示したものでもあるため、末尾の桁がこの値になる原因をここで断定することはしません。ここで確かめられるのは、&lt;code&gt;PIC&lt;/code&gt; 句の十進側と &lt;code&gt;USAGE COMP-2&lt;/code&gt; の二進側とで結果が食い違う、という事実までです。COBOL の側に「金額の計算を十進で行う型」が用意されている、というのがこの対比の意味です。&lt;/p&gt;
&lt;h2 id="5-もう一歩--自由形式と-88-レベル"&gt;&lt;a href="#5-%e3%82%82%e3%81%86%e4%b8%80%e6%ad%a9--%e8%87%aa%e7%94%b1%e5%bd%a2%e5%bc%8f%e3%81%a8-88-%e3%83%ac%e3%83%99%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;5. もう一歩 — 自由形式と 88 レベル
&lt;/h2&gt;&lt;p&gt;第3章の桁位置は、&lt;code&gt;-free&lt;/code&gt; オプションで外せます。&lt;code&gt;demo/freeform.cob&lt;/code&gt; は、行頭から書き始められる自由形式で書かれています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cobol" data-lang="cobol"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt;IDENTI&lt;/span&gt;&lt;span style="color:#00d3d0"&gt;FICATION&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DIVISION&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt;PROGRA&lt;/span&gt;&lt;span style="color:#00d3d0"&gt;M-ID&lt;/span&gt;. &lt;span style="color:#00d3d0"&gt;FREEFORM&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt;DATA D&lt;/span&gt;&lt;span style="color:#00d3d0"&gt;IVISION&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt;WORKIN&lt;/span&gt;&lt;span style="color:#00d3d0"&gt;G-STORAGE&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;SECTION&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt;01 WS-&lt;/span&gt;&lt;span style="color:#00d3d0"&gt;AGE&lt;/span&gt; &lt;span style="color:#6ae4b9"&gt;PIC 9(3)&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;VALUE&lt;/span&gt; &lt;span style="color:#00bcff"&gt;20&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; 88 &lt;/span&gt;&lt;span style="color:#00d3d0"&gt;ADULT&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;VALUE&lt;/span&gt; &lt;span style="color:#00bcff"&gt;18 &lt;/span&gt;&lt;span style="color:#b6a0ff"&gt;THRU&lt;/span&gt; &lt;span style="color:#00bcff"&gt;199&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; 88 &lt;/span&gt;&lt;span style="color:#00d3d0"&gt;CHILD&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;VALUE&lt;/span&gt; &lt;span style="color:#00bcff"&gt;0 &lt;/span&gt;&lt;span style="color:#b6a0ff"&gt;THRU&lt;/span&gt; &lt;span style="color:#00bcff"&gt;17&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt;PROCED&lt;/span&gt;&lt;span style="color:#00d3d0"&gt;URE&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DIVISION&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; IF&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;ADULT&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;THEN&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DISPLAY &lt;/span&gt;&lt;span style="color:#79a8ff"&gt;&amp;#34;ADULT&amp;#34;&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;END-IF&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; MO&lt;/span&gt;&lt;span style="color:#00d3d0"&gt;VE&lt;/span&gt; &lt;span style="color:#00bcff"&gt;10 &lt;/span&gt;&lt;span style="color:#b6a0ff"&gt;TO&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;WS-AGE&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; IF&lt;/span&gt; &lt;span style="color:#00d3d0"&gt;CHILD&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;THEN&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;DISPLAY &lt;/span&gt;&lt;span style="color:#79a8ff"&gt;&amp;#34;CHILD&amp;#34;&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;END-IF&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a8a8a8"&gt; ST&lt;/span&gt;&lt;span style="color:#00d3d0"&gt;OP&lt;/span&gt; &lt;span style="color:#b6a0ff"&gt;RUN&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;cobc&lt;/code&gt; の &lt;code&gt;-free&lt;/code&gt; オプションは、GnuCOBOL の&lt;a class="link" href="https://gnucobol.sourceforge.io/doc/gnucobol.html" target="_blank" rel="noopener"
 &gt;公式ドキュメント&lt;/a&gt;にある自由形式の指定です。固定形式のときとの違いは、&lt;code&gt;IDENTIFICATION DIVISION.&lt;/code&gt; も &lt;code&gt;01 WS-AGE&lt;/code&gt; も行頭から書けることです。&lt;/p&gt;
&lt;p&gt;コンパイルのときだけ &lt;code&gt;-free&lt;/code&gt; を足します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#fff;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ./run.sh bash -c &amp;#39;cobc -x -free /work/freeform.cob &amp;amp;&amp;amp; cd /work &amp;amp;&amp;amp; ./freeform&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ADULT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CHILD
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;WS-AGE&lt;/code&gt; の値は最初 20 で、&lt;code&gt;88 ADULT VALUE 18 THRU 199&lt;/code&gt; の範囲に入るので &lt;code&gt;IF ADULT&lt;/code&gt; が真になり、1行目の &lt;code&gt;ADULT&lt;/code&gt; が出ます。その後 &lt;code&gt;MOVE 10 TO WS-AGE&lt;/code&gt; で 10 に書き換えると、今度は &lt;code&gt;88 CHILD VALUE 0 THRU 17&lt;/code&gt; の範囲に入るので &lt;code&gt;IF CHILD&lt;/code&gt; が真になり、2行目の &lt;code&gt;CHILD&lt;/code&gt; が出ます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;88&lt;/code&gt; で始まる行は &lt;strong&gt;条件名&lt;/strong&gt; です。&lt;code&gt;IF ADULT&lt;/code&gt; のように、値の範囲に名前を付けて条件式として書けます。条件名は値を格納するための項目ではなく、親の項目 &lt;code&gt;WS-AGE&lt;/code&gt; の値を見て真偽が決まります。&lt;code&gt;IF WS-AGE &amp;gt;= 18&lt;/code&gt; と書く代わりに &lt;code&gt;ADULT&lt;/code&gt; と書ける、というのは、読みやすさを優先した設計に見えます。&lt;/p&gt;
&lt;p&gt;固定形式と自由形式の切り替えは、&lt;code&gt;cobc&lt;/code&gt; のオプション1つです。同じ処理系のなかで両方の書き方が試せるので、桁位置の作法を確かめたいときは &lt;code&gt;basics.cob&lt;/code&gt; と &lt;code&gt;freeform.cob&lt;/code&gt; を見比べるのが早いです。自由形式がいつ規格に入ったかは、次の章で触れます。&lt;/p&gt;
&lt;h2 id="6-背景と現在地"&gt;&lt;a href="#6-%e8%83%8c%e6%99%af%e3%81%a8%e7%8f%be%e5%9c%a8%e5%9c%b0" class="header-anchor"&gt;&lt;/a&gt;6. 背景と現在地
&lt;/h2&gt;&lt;p&gt;ここまでは実行結果で裏が取れる話でした。この章にはそうでない話、つまり由来と規格をまとめます。&lt;/p&gt;
&lt;p&gt;COBOL は &lt;strong&gt;CO&lt;/strong&gt;mmon &lt;strong&gt;B&lt;/strong&gt;usiness-&lt;strong&gt;O&lt;/strong&gt;riented &lt;strong&gt;L&lt;/strong&gt;anguage の頭字語で、事務処理向けの共通言語という用途がそのまま名前になっています（&lt;a class="link" href="https://en.wikipedia.org/wiki/COBOL" target="_blank" rel="noopener"
 &gt;Wikipedia の COBOL の項&lt;/a&gt; による）。1959年5月28日から29日にかけて、そうした共通言語を作るための会合がペンタゴンで開かれ、この活動はのちに CODASYL（Committee on Data Systems Languages）と名付けられたとされます。仕様は1960年1月8日に執行委員会で承認され、COBOL 60 として印刷されたと伝えられています。&lt;/p&gt;
&lt;p&gt;仕様を設計したのは CODASYL の短期委員会で、&lt;a class="link" href="https://en.wikipedia.org/wiki/Jean_E._Sammet" target="_blank" rel="noopener"
 &gt;Jean Sammet&lt;/a&gt; らが初期仕様を共同設計した、とされます。Grace Hopper は、その土台の一つになったとされる &lt;a class="link" href="https://en.wikipedia.org/wiki/FLOW-MATIC" target="_blank" rel="noopener"
 &gt;FLOW-MATIC&lt;/a&gt; を作った人で、COBOL の開発には技術顧問として関わりました。仕様そのものの作者ではありません。COBOL を作った当事者の講演録が &lt;a class="link" href="https://archive.computerhistory.org/resources/access/text/2017/10/102639620-05-01-acc.pdf" target="_blank" rel="noopener"
 &gt;Computer History Museum に公開&lt;/a&gt; されており、そこには、Hopper が Bob Bemer とともに委員会へ助言した2人のアドバイザーの1人だったという証言や、決定の遅さに苛立った委員が「COBOL」と彫った墓石をペンタゴンへ送りつけた話が語られています。&lt;/p&gt;
&lt;p&gt;規格の更新はいまも続いていて、最新は &lt;a class="link" href="https://webstore.iec.ch/en/publication/82522" target="_blank" rel="noopener"
 &gt;ISO/IEC 1989:2023&lt;/a&gt;（2023年1月31日発行）です。第5章で試した自由形式は、COBOL 2002 の規格から入ったとされます。&lt;/p&gt;
&lt;p&gt;適用分野は、銀行・保険・行政の基幹業務だとされます。後の言語への影響としては、&lt;code&gt;01&lt;/code&gt; や &lt;code&gt;05&lt;/code&gt; の階層番号でデータを構造化する考え方が構造体やレコード型に通じ、十進演算を使う設計が decimal 型に通じるとされます。ただし、これは系譜としてそう語られているという範囲の話で、実行結果のように確かめたわけではありません。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81" class="header-anchor"&gt;&lt;/a&gt;まとめ
&lt;/h2&gt;&lt;p&gt;コンテナ1つで GnuCOBOL 3.2.0 に入り、&lt;code&gt;cobc -x&lt;/code&gt; で3本のプログラムを動かしました。&lt;code&gt;PIC&lt;/code&gt; 句による桁の定義と編集項目、十進と二進で同じ 0.1 + 0.2 が違う答えになる対比、そして固定形式と自由形式、条件名の 88 レベルです。COBOL は古いからではなく、金額を扱うための機能が言語に入っていることで、いまも試す価値があります。&lt;/p&gt;
&lt;p&gt;次に読むなら、&lt;a class="link" href="https://gnucobol.sourceforge.io/doc/gnucobol.html" target="_blank" rel="noopener"
 &gt;GnuCOBOL の公式ドキュメント&lt;/a&gt; が入口です。コードは &lt;code&gt;lang-playground&lt;/code&gt; の &lt;code&gt;20260922-COBOL&lt;/code&gt; にあるので、&lt;code&gt;decimal.cob&lt;/code&gt; の桁数や型を変えて、結果がどう動くか試してみてください。&lt;/p&gt;
&lt;h2 id="参考リンク"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e3%83%aa%e3%83%b3%e3%82%af" class="header-anchor"&gt;&lt;/a&gt;参考リンク
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gnucobol.sourceforge.io/" target="_blank" rel="noopener"
 &gt;GnuCOBOL 公式サイト&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/densuke/lang-playground/tree/main/20260922-COBOL" target="_blank" rel="noopener"
 &gt;実験環境（lang-playground 20260922-COBOL）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://webstore.iec.ch/en/publication/82522" target="_blank" rel="noopener"
 &gt;ISO/IEC 1989:2023&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://archive.computerhistory.org/resources/access/text/2017/10/102639620-05-01-acc.pdf" target="_blank" rel="noopener"
 &gt;Computer History Museum 講演録（PDF）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>