C言語で扱うことができる数値には、大きく分けて整数と浮動小数点数があります。整数については第6回で詳しく取り上げましたので、今回は浮動小数点数について詳しく見ていきましょう。
といっても、C言語の浮動小数点数に関する規格は、難解な数式がたくさん出てくる割にはこれといった決まりがなく、漠然としたことしか分かりません。また、最近の処理系の大多数はIEEE 754という規格に準拠していますので、浮動小数点数の内部表現に関する説明はウィキペディアの記事に譲ることにします。
さて、このページを読まれている方の中には、「浮動小数点数」というと「実数」を扱うためのものだと思われている方もおられるのではないでしょうか?
C言語の規格では、「浮動小数点数」と「実数」はまったくの別物です。まず、「実数」とは何かですが、これは「虚数」、すなわち複素数や純虚数に対しての「実数」ということになります。
実際、C99以降では、「実数型」というのが定義されており、それは「整数型」と「実浮動小数点型」の総称であるとされています。この「実浮動小数点型」というのが曲者です。
「実浮動小数点型」というのは、文字通り、実数を表すための浮動小数点型のことです。では、虚数を表す浮動小数点型もあるのでしょうか?
C99以降では_Complexという予約語が追加されました。この予約語は、float _Complex、double _Complex、long double _Complexのように記述することで、複素数型を表すために使用します。
あと、これは任意実装なのですべての処理系でサポートされるとは限りませんが、_Imaginaryという予約語もあります。これも_Complexと同じようにfloatなどと組み合わせて純虚数型を表します。
そして、C言語における「浮動小数点型」というのは、おなじみのfloat、double、long doubleに、複素数型を(そしてサポートされるのであれば純虚数型も)加えたものの総称なのです。そして、その型が表すことができる実部と虚部の組み合わせに応じて、「型領域」という概念が導入されています。
型領域には、(_Imaginaryが任意実装なので)通常は「実数型領域」と「複素数型領域」があります。この型領域という概念は、型変換を理解する上でも必要になります。
なお、フリースタンディング環境の場合、複素数型も任意実装になりますので、C99準拠の処理系であっても_Complexが使えないことがあり得ます。また、C11以降ではホスト環境でも任意実装になったため、処理系が__STDC_NO_COMPLEX__マクロを定義していれば複素数型はサポートされません。