第9回 浮動小数点数と実数

C 言語で扱うことができる数値には、大きく分けて整数と浮動小数点数があります。整数については第6回で詳しく取り上げましたので、今回は浮動小数点数について詳しく見ていきましょう。

といっても、C 言語の浮動小数点数に関する規格は、難解な数式がたくさん出てくる割には、これといった決まりがなく、漠然としたことしか分かりません。また、最近の処理系の大多数は IEEE 754 という規格に準拠していますので、浮動小数点数の内部表現に関する説明はウィキペディアの記事に譲ることにします。

さて、このページを読まれている方の中には、「浮動小数点数」というと「実数」を扱うためのものだと思われている方もおられるのではないでしょうか?

C 言語の規格では、「浮動小数点数」と「実数」はまったくの別物です。まず、「実数」とは何かですが、これは「虚数」、すなわち複素数や純虚数に対しての「実数」ということになります。

実際、C 言語の現行規格では、「実数型」というのが定義されており、それは「整数型」と「実浮動小数点型」の総称であるとされています。この「浮動小数点型」というのが曲者です。

「実浮動小数点型」というのは、文字通り、実数を表すための浮動小数点型のことです。では、虚数を表す浮動小数点型もあるのでしょうか?

C 言語の現行規格(通称 C99)では、_Complex という予約語が追加されました。この予約語は、float _Complexdouble _Complexlong double _Complex のように記述することで、複素数型を表すために使用します。

あと、これは任意実装なのですべての処理系でサポートされるとは限りませんが、_Imaginary という予約語もあります。これも _Complex と同じように float などと組み合わせて純虚数型を表します。

そして、C 言語における「浮動小数点型」というのは、おなじみの floatdoublelong double に、複素数型を(そしてサポートされるのであれば純虚数型も)加えたものの総称なのです。そして、その型が表すことができる実部と虚部の組み合わせに応じて、「型領域」という概念が導入されています。

型領域には、(_Imaginary が任意実装なので)通常は「実数型領域」と「複素数型領域」があります。この型領域という概念は、型変換を理解する上でも必要になります。

なお、フリースタンディング環境の場合、複素数型も任意実装になりますので、C99 準拠の処理系であっても _Complex が使えないことがあり得ます。

このエントリーを含むはてなブックマーク