【精度か速度か】float型とdouble型の変数の違い

プログラミング
スポンサーリンク
スポンサーリンク

はじめに

プログラミングで扱う《浮動小数点数》の型として「float」「double」が存在する。

どちらも小数をデータ上で扱うのに使われる型だが、いったいこの2つの違いはなんだろうかと、
夜しかねれない、3食しか喉に通らないといった日々が続いていると思う。全人類

なので、わかりやすく教えるのがこの記事である。ありがたい

float型とdouble型の変数の違い

メモリサイズ

この2つの型の大きな違いは、使用するメモリサイズです。floatは32bitdoubleは64bitになります。

最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速にできたり、と様々です。

32bitCPUでは、32bitのfloatの方が扱いやすいでしょうが、64bitCPUでは64bitのdoubleの方が扱いやすかったりします。

プログラムの書き方

float型をプログラムで扱う場合、数字の末尾に「f」をつける必要があります。
double型は小数点を記述する一般的な書き方で扱えます。

float f = 1.23f; //float型をプログラムで扱う場合、数字の末尾に「f」をつける
double d = 1.0;  //double型は小数点を記述する一般的な書き方

扱うデータサイズ

float型とdouble型は扱える数字の範囲が大きく異なる

扱う数字
float ±3.4028235E38~±1.4E-45
double ±1.7976931348623157E308~±4.9E-324

ぱっとみ、どっちのほうが扱える数字が多いのかわからない人もいるだろう。

注目してほしいのは、《E38》《E308》といった数字。
これらは10の何乗かを表している。

例) 2342E38→2342*10^38

これを理解するとdoubleのほうが圧倒的に多くの数字の範囲を扱えることができるというわけである。

このことから、double型のほうが処理には多くの時間がかかることがわかります。

誤差

プログラミング言語というのは人間界の言語を1と0のPCの言語に変換するためのものです。
しかし、1と0だけの世界では少数は表現できません

そこでプログラムでは、小数を特殊な方法で近似して表現しています。
こういった数を「浮動小数点数」と呼びます。

この浮動小数点数には「誤差」が含まれます。
なぜならば、浮動小数点数は、実数そのものではなく、その近似でしかないからです。

1.1 + 2.2  → 3.3000000000000003と出力してしまう。

float型とdouble型では、扱える値が大きいdouble型のほうが誤差が小さな状態で計算することが可能です。

どうやって使い分ければいいの?

基本的には「処理速度」「精度」のどちらを優先すべきなのかを考えて扱います。
要は「何を作りたいか」です。

処理速度を優先的に小数を扱うならば《 float型 》
精度を優先的に小数を扱うならば《 double型 》

また、精度無視処理最優先《 int型 》(整数)を使うという選択肢もあります。

最後に

プログラミングを始めたばかりのときは精度と速度のどちらを優先すべきなのかわからないことも多いかもしれません。

FPU→浮動小数演算器(Floating Point number processing Unit)と呼ばれる浮動小数演算のみを行うための専用ユニットの有無メモリ量プラットフォームの仕様を視野に入れて考えてみても良いと思います。

少なくともゲームなどを作る上ではいずれは必要となる知識なので、頭の片隅にでも覚えてくれたら幸いです。

コメント

タイトルとURLをコピーしました