浮動小数点数を使わないで小数を表現するためには固定小数点数を使います。
これはブログで書くほどの話題か悩んだのですが、 C/C++ では固定小数点数型がないため一応書いておきます。
今ではめっきり聞かなくなりましたが「浮動小数点数を使うと CPU のクロック数が余分にかかる」と言われていた時代がありまして、「だったら浮動小数点数を使わなければ良いんだ」というのが現実解でした(特にゲームの場合)。ちなみに私の時代で整数演算ユニットと浮動小数演算ユニットの切り替えに 15 クロックくらいかかっていました。足し算ひとつで1クロックと考えるとあり得ないオーバーヘッドですよね。
また、浮動小数点数は仕組みを知らないで使うと誤差が大きくなってバグの原因にもなり得ます。このあたりの理由から給与計算などのお金に関わる計算には固定小数点数を使うことがあったりします。
では、固定小数点数が無い C/C++ ではどうすればいいのかというと、たとえば 1.25 という数値を表現したいときは 1250 と保持しておいて、整数部が必要なときに 1000 で除算するのです。つまり 1000 を1として計算するわけですね。こうすると4桁分の精度で小数部が実現できることになります。もちろん計算する場合はすべての数に対してこのルールを適用しなければなりません。
さて、ここまで読んでいただいて「なるほど、ためになったぜ」と思われた方、非常に申し訳ないのですが、 3D ゲームが主流の現在において固定小数点数はほとんど使わないと思います。最近の CPU は速過ぎなんです。しかもコンパイラも頭が良いので、もしかしたらライスタライザを自分で書いてもゲームになるかもしれません。
余談なのですが COBOL というプログラミング言語がありまして、この言語は固定小数点数がメインになっています。なぜかというと COBOL で作られるアプリケーションはビジネス向けに限定されるためです。つまり、誤差などがありますとかなり嬉しくないわけですね。 COBOL = COmmon Business Oriented Language です。
Contributions