web-dev-qa-db-ja.com

なぜそれほど多くの数値型(ビット、整数、浮動小数点数、倍精度浮動小数点数、長整数型)があるのですか?

私はPHP、Java、およびCを学びました。ビット、整数、浮動小数点、倍精度浮動小数点数、長整数型など、数値データ型の種類が非常に多いのはなぜでしょうか。数値のタイプを1つだけにしないでください。

これには何か利点がありますか?たぶん、そのような小さな数を保持するために整数を使用すると、メモリを節約できますか?

9
GusDeCooL

異なる数値データタイプを考慮する必要がある理由は2つあります。

1.メモリの節約

for(long k=0;k<=10;k++)
{
    //stuff
}

整数やバイトになりやすいのに、なぜlongを使用するのですか?そうすることで、実際に数バイトのメモリを節約できます。

2.浮動小数点数と整数はコンピューターに異なる方法で保存されます

整数に22が格納されているとします。コンピュータはこの数値を次のようにバイナリでメモリに保存します。

0000 0000 0000 0000 0000 0000 0001 0110

2進数システムに慣れていない場合、これは2 ^ 0 * 0 + 2 ^ 1 * 1 + 2 ^ 2 * 1 + 2 ^ 3 * 0 + 2 ^ 4 * 1 +のように科学表記法で表すことができます。 2 ^ 5 * 0 + ... + 2 ^ 30 * 0。最後のビットは、数値が負かどうかを示すために使用される場合とされない場合があります(データ型が符号付きか符号なしかによって異なります)。

基本的に、これは2 ^(ビットプレース)*値の合計です。

これは、小数点を含む値を参照しているときに変わります。 10進数で3.75という数値があるとします。これは、バイナリでは11.11と呼ばれます。これを2 ^ 1 * 1 + 2 ^ 0 * 1 + 2 ^ -1 * 1 + 2 ^ -2 * 1として科学表記法で表すか、1.111 * 2 ^ 2として正規化できます。

ただし、コンピューターはそれを格納できません。その2進小数点(小数点の2進数システムバージョン)を明示的に表現する方法はありません。コンピュータは1と0しか保存できません。これが浮動小数点データ型の出番です。

Sizeof(float)が4バイトであるとすると、合計で32ビットになります。最初のビットには「符号ビット」が割り当てられます。符号なしのfloatまたはdoubleはありません。次の8ビットは「指数」に使用され、最後の23ビットは「仮数」(または仮数と呼ばれることもあります)として使用されます。 3.75の例を使用すると、指数は2 ^ 1になり、仮数は1.111になります。

最初のビットが1の場合、数値は負です。そうでない場合、肯定的です。指数は「バイアス」と呼ばれるものによって変更されるため、単純に「0000 0010」を指数として格納することはできません。単精度浮動小数点数のバイアスは127で、倍精度(これはdoubleデータ型がその名前を取得する場所)のバイアスは1023です。最後の23ビットは仮数用に予約されています。仮数は、2進小数点のRIGHTに対する値です。

私たちの指数は、バイアス(127)+指数(1)またはバイナリで表されます

1000 0000

私たちの意味は次のようになります:

111 0000 0000 0000 0000 0000

したがって、3.75は次のように表されます。

0100 0000 0111 0000 0000 0000 0000 0000

ここで、浮動小数点数と整数として表される8を見てみましょう。

0100 0001 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 1000

コンピュータはどのようにして8.0と8を追加するのですか?またはそれらを掛ける!?コンピューター(より具体的には、x86コンピューター)には、浮動小数点数と整数値を追加するCPUのさまざまな部分があります。

17
cpmjr123

ギガバイトシステム(またはArduinoのような最新の組み込みシステム)が登場する前は、メモリが非常に高価でした。そのため、特定の数値が占めるメモリの量を指定するための簡略化されたメソッドが実装されました。メモリの。

その他のデータサイズと名前はシステムによって異なります。 32ビットシステムでは、INT(またはMEDIUMINT)は通常2バイト、LONGINTは4バイト、SMALLINTは1バイトです。 64ビットシステムでは、LONGINTを8バイトに設定できます。

現在でも-特にデータベースアプリケーション、またはサーバー上で実行されている複数のインスタンスを持つプログラム(Webサイトのサーバー側スクリプトなど)では-何を選択するかに注意する必要があります。 2、4、または8バイト幅の整数を選択して0〜100(1バイトに収まる)の値を格納することは、数百万のレコードを持つデータベーステーブルがある場合、非常に無駄です。

詳細: https://en.wikipedia.org/wiki/Integer_(computer_science)

6
HorusKol

メモリ不足と精度、および範囲のトレードオフに関するcpmjr123の優れた点に加えて、これらは潜在的にCPUのトレードオフでもあります。

最近のほとんどのマシンには、FPUと呼ばれる浮動小数点演算を実行するための特別なハードウェアがあります。 FPUが搭載されていないシステムもあります(現在、これらは通常、小さな組み込みデバイスです)。そのため、ターゲットハードウェアに応じて、浮動小数点型をまったく使用しないか、ソフトウェアの浮動小数点ライブラリを使用する必要があります。マシンにFPUが搭載されていても、提供できる機能には歴史的に違いがありました。ハードウェアで実行されない機能は、ソフトウェアで実行する(または回避する)必要があります。

ソフトウェアで浮動小数点計算を行うには、ハードウェアがサポートする多くの単純な操作を実行します。したがって、速度のトレードオフの可能性もあります。

4
jk.

おそらく最も重要なことは、実際には3つの異なる基本的な数値タイプがあるということです。

整数、固定小数点、浮動小数点。

それらはすべて異なる動作をします。

7/2のような単純な操作では、使用するデータ型に応じて、3、3.50、3.499の回答が得られます。

「固定小数点」はシンデレラ型であり、COBOLやVisualBasicなどのいくつかの言語でネイティブにのみサポートされています。コンピュータサイエンティストにとってはあまり重要ではありませんが、一連のアカウントを送信したり、請求書で消費税を計算したりする人にとっては非常に重要です。

4
James Anderson

彼らがそれを作る利点はありますか?

もちろん。メリットがあります。コンピュータの世界では、メモリは考慮すべき最も重要なことの1つです。 データが1kb未満に収まる場合に2kbのメモリを使用することは何ですか?。最適化が必要です。より多くのメモリを使用すると、ある時点で明らかにコンピュータの速度が低下します。本当に食べたいですか?権利はありません...?

int - 2 bytes (16 bits)

long - 4 bytes (32 bits)

long long - 8 bytes (64 bits)

float - 4 bytes

記憶だけでなく、数字の種類の整理もあります。インスタンスの浮動小数点。精度は非常に重要であり、明らかに、より高い精度を提供できる1つのタイプが必要です。

昔を考えると、ご存知のように記憶が非常に少なかったのです。それを保存して賢く使用するために、これらの違いがありました。さらに、先に進んでgoogle。で検索してみてください。これがお役に立てば幸いです。

3
Vinay

整数と実数(float、double)数は、概念的には異なる型であり、演算と組み込みプロパティのセットが異なります。

整数は列挙可能ですが、浮動小数点はそうではありません。

実際、Float/double数値は、仮数と指数の2つの整数フィールドを組み合わせた構造です。複素数(検討から除外したもの)はさらに複雑です。

実用的な言語では、少なくとも整数と浮動小数点数を別個の型として持つ必要があります-それらに対する操作が多すぎます。

3
c-smile