はじめMath! Javaでコンピュータ数学

第8回 実数型のしくみ[前編]

この記事を読むのに必要な時間:およそ 3 分

ものづくりには規格が必要です。「規格」と聞くとルールに縛られるイメージがあります。しかし,ものづくりにおける規格は,私たちを余計な作業から自由にします。

規格が私たちを助けてくれる身近な例は「ねじ」です。日本にはJIS(日本工業規格)があります。JISにそって作られた同じ規格の雄雌のねじは,どの会社が作ったものでも互いにかみ合います。もしそうでなかったら,ひとつの会社の作った部品しか使えなくなります。

規格があるというのは,ある程度規格のことを知る手間がかかるデメリットを考えても,大変有利なことなのです。ものづくりの名人はたくさんの規格を知っていて,上手に活用します。規格にそって,省ける手間は極力省き,規格で対応していないような,本当に考えて作らなければならない部分に集中するのです。

プログラミングの世界にもたくさんの規格があります。基本的なものについて大まかに知っておくと良いでしょう。今回学習するのは,そんな規格の一つ,実数の仕組みの規格です。

実数をコンピュータで表現する方法はたくさんあり,それぞれに一長一短があります。使用するOSやプログラミング言語によって違います。しかし,Java言語はOSや機種によらず,これから学習する規格だけを採用しています。どのコンピュータで作ったデータも,この規格にそっているため,互いにやりとりして困ることがありません。C言語も同じ規格を使っていますので,学んで損はありません。少々の手間がかかりますが,あきらめず,課題まで取り組んでください。今回でしっかり理解してしまいましょう。

図8.1 規格を活かしててきぱき作業

図8.1 規格を活かしててきぱき作業

実数型のしくみ

Java言語の実数※1型は浮動小数点数という方法で表現されています。浮動小数点数とは,符号部S・指数部E・仮数部M・バイアスBとして実数Rを次のように表現する方法です。

たとえば,R=-1.23であれば,

といった具合です。どうしてこんなに複雑な形にしなければならないのでしょうか。それはこのような正規化数※2にすることで,科学技術計算に出てくる,とても大きな値やとても小さい値をコンピュータで取り扱いやすくなるからです。

プログラミング言語入門書や教科書では,「整数値は整数型に,小数を含んだ数は実数型に」という説明にとどめる場合が多いですね。実数型が浮動小数点数であることや,詳しい浮動小数点数の仕組みまで立ち入って説明されません。しかしこの知識が無いと,コンピュータで数値計算を行う場合に発生する誤差の理由が具体的にわかりません。しっかり浮動小数点数の仕組みを理解しておきましょう。

浮動小数点数は,高級※3プログラミング言語のほとんどが対応しています。浮動小数点数にはIEEE方式やIBM方式があります。現在最も広く用いられているのはIEEE方式のIEEE754(IEEE二進化浮動小数点数演算標準)です。浮動小数点数表現は近似値表現であるため,様々な形で誤差が発生するということをよく覚えておいてください。

※1
実数とは,数学的には整数・分数といった有理数と,無理数からなる集合です。有理数とは分数の形(比の形)で表される数,無理数とは分数で表せない数です。これから学ぶJava言語で取り扱える実数の範囲は大変限られています。
※2
正規化数とは,一定の形をした数という意味です。浮動小数点数IEEE754では,仮数部を0から1の範囲に収めるように数値を変換します。指数部でその数値の桁数を表現し,符号部で正負の符号を表現します。
※3
ここでいう高級とは「高価な」という意味ではありません。プログラミングを行う際,決まり切った手続きや煩雑な手順を,ある程度コンピュータに肩代わりさせる機能を持たせたプログラミング言語という意味です。高級言語には,Java,C++,BASICなどがあります。対する低級言語とは,コンピュータに実行可能な最低限度の命令セットを備えた言語です。多くの場合でマシン語,アセンブリ言語を意味します。高水準言語,低水準言語という呼び分けもあります。C言語は高級言語ですが,低級言語的に利用できるため,中級言語と呼ばれることもあります。

IEEE754とは

IEEE754とはIEEE※4の定める浮動小数点数の表現方法の標準規格です。浮動小数点数の表現形式を規定するとともに,無限大や非数といった特殊な値も規定し,浮動小数点演算でのそれらの値の扱い方を規定しています。

単精度倍精度など4種類※5あり,取り扱える数値の絶対値の大きさと仮数部の桁数が異なっています。標準では単精度のみが必須とされていて,他はオプションです。

現在多くのC言語はfloatがIEEEの単精度,doubleはIEEEの倍精度※6となっています。

Java言語はIEEE754に準拠しており,表8.1のように2つの浮動小数点数の実数型があります。

表8.1 Java言語の数値型

バイト整数型byte8bit-128~127
短整数型short16bit-32768~32767
整数型int32bit-2147483648~2147483647
長整数型long64bit-9223372036854775808~
9223372036854775807
単精度実数型float32bit±1.40239846×10-45
±3.40282347×1038
倍精度実数型double64bit±4.9406545841246544×10-324
~±1.79769313486231570×10308
※4
IEEE(The Institute of Electrical and Electronics Engineers, Inc.)アイトリプルイーと読み,非営利の電気・電子技術の学会です。アメリカに本部を持っています。
※5
単精度(32ビット),倍精度(64ビット),拡張単精度(43ビット以上),拡張倍精度(79ビット以上。通常80ビット)。
※6
K&Rの著書「プログラミング言語CANSI規格準拠」には,float,double,long double は同じサイズのこともあれば違うこともあると書かれています。CがIEEE754以前に作られた言語であるためです。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。

コメント

コメントの記入