概要
私たちは普段、0と0.0を区別しているでしょうか?+0.0と-0.0の違いを考えることはありますでしょうか?そもそも厳密な整数の計算はある程度大きさまでしか必要としないのではないでしょうか?ある程度大きかったらそこそこの精度で十分じゃないでしょうか?また、5/3を1余り2と答えるのは小学生までだと思っていませんでしょうか?
そんなことを考えたら、整数とか浮動小数点数とか別々に考えるのがばからしくなってきます。ある程度までは整数で、小数だったり指数が必要なぐらい大きな数なら浮動小数点数ですまそうというのが曖昧な数値型です。「曖昧な数値型」って言っていますが、別に名前があるわけじゃありません。それぞれの言語は、その言語のただ一つの最も正しい数値型の実装だと思い込んでいます。
曖昧な数値型の特徴
細かい仕様は言語によって異なりますが、次のような特徴があります。
- 内部で整数型と浮動小数点数型を自動で切り替えます。
- 整数で表現できそうな時はだいたい整数になります。
- 除算で割り切れないときは浮動小数点数になります。
- 内部での整数表現を越える場合は勝手に浮動小数点数に変換します。
- ビット演算やシフト演算は整数として扱います。
厳密な計算や巨大な数値を扱わない場合はだいたい期待通り動きます。しかし、プログラマーが完全に制御するには言語仕様をよく読んでおく必要があり、複雑になります。
その他の言語
PHPも自動的に浮動小数点数に変わりますが、PHP_INT_MAXという定数や型を判別するための関数が用意されており、切り替わったのかどうかを確認できます。PerlやJavaScriptにそのような者が用意されているかはわかりませんでした。