コンピュータは「1」と「0」の観点から考えるので、7.50などの分数をどのように計算して表すのでしょうか。私はJavaとJavaScriptを知っています。答えが必要な場合は、それらを例として使用できます。
編集:私は46:31秒にコーメン教授によるハッシュに関するこのMITビデオを見ていました。彼は、いくつかの点が含まれる単位円であり、点が分数を表すモジュラーホイールを使用した乗算ハッシュ関数について説明しています。これにより、私はこの基本的な質問をここSOで行うようになりました。
コンピュータは「1」と「0」の観点から考えるので、7.50などの分数をどのように計算して表すのでしょうか。私はJavaとJavaScriptを知っています。答えが必要な場合は、それらを例として使用できます。
編集:私は46:31秒にコーメン教授によるハッシュに関するこのMITビデオを見ていました。彼は、いくつかの点が含まれる単位円であり、点が分数を表すモジュラーホイールを使用した乗算ハッシュ関数について説明しています。これにより、私はこの基本的な質問をここSOで行うようになりました。
コンピューターで整数以外の数値を表す最も一般的な方法は、浮動小数点、特にIEEE754浮動小数点を使用することです。ご存知かもしれませんが、整数は通常、ハードウェアビットを使用して2進数を表すことで表されるため、物理的特性(電荷または電荷の欠如、高電圧または低電圧、一方向または別の方向の磁場など)は次のように使用されます。ビット(0および1)を表し、それらのビットのシーケンスによって数値(11010など)が作成されます。これは、2進数で数値を表すと解釈されます(110102は16+ 8 + 2 = 26)。通常は考えませんが、この数字の右側に「11010」という「小数点」があります。基数が必要なのは、その右側に分数を表すビットが多い場合のみです。例:11010.11 2は16+8 + 2 + 1/2 + 1/4=26.75です。整数から浮動小数点に変更するには、基数を浮動小数点にします。数字を表すビットに加えて、小数点を置く場所を示すいくつかの追加ビットがあります。
したがって、基数ポイントがどこに行くかを示す3つのビット、たとえば010と、値を表す他のビット、たとえば1101011があります。基数ビット010は、「1101011」を変更して、小数点を2桁左に移動すると言う場合があります。「11010.11」に。
単精度IEEE754には、1つの符号ビット(+または-を示す)、8つの指数ビット、および23の値ビット(「仮数」または「小数部」)があります。指数ビットの値0と255は特別です。指数ビットの他の値については、127を減算して、-126(小数点を126ビット左にシフト)から127(基数ポイントを127ビット右にシフト)の範囲の指数を取得します。仮数ビットは、少し変更することを除いて、2進数として解釈されます。「1」、基数ポイント、仮数の23ビットと書くので、「1.1101011000…」のようになります。別の方法として、これを整数と考えることができます。「1」の場合、基数ポイントが挿入されていない23ビットで、24ビットの2進数になりますが、指数は23で調整されます(したがって、127ではなく150を減算します)。 。
倍精度IEEE754には、1つの符号ビット、11の指数ビット、および52の仮数ビットがあります。
あまり一般的ではない他の浮動小数点形式があります。古いものの中には、16進数をベースとして使用するものがあります(指数を使用して、1ビットではなく4ビットのシフトを示します)。浮動小数点形式の重要なタイプは10進数で、指数は10の累乗を示します。10進数の浮動小数点では、符号は2進数の整数、または2進数でコード化された10進数(各4ビットは10進数を示します)にすることができます。 )またはハイブリッドにすることもできます(ビットのグループは、カスタマイズされたスキームに従って少数の10進数を示すために使用されます)。
浮動小数点数の重要な特性は、すべての実数(もちろん有限の範囲であっても)またはすべての有理数を表すことができないことです。これにより、数学演算は表現可能な数値に丸められた結果を返すように強制されます。これにより、浮動小数点の操作に慣れていない人にとっては問題が終わりません。このプロパティは、10進数の浮動小数点の機能になります。10進数の浮動小数点を注意深く使用することでほとんどの丸め誤差を排除できるため、通常は10進数で操作される通貨単位やその他の人間に関連する数値を操作するのに適しています。科学者や数学者は、人間が汚染した数値ではなく、自然に関連する数値や純粋な数値を扱う傾向があります。これは、バイナリ浮動小数点がより広く利用可能であり、ハードウェアによって十分にサポートされているためです。
コンピューターで整数以外の数値を表す方法は他にもあります。もう1つの一般的な方法は、固定小数点です。固定小数点では、1101011などのビットのシーケンスは、既知の固定位置にある小数点で解釈されます。位置は、特定のアプリケーションに役立つ位置に固定されます。したがって、ビット1101011は番号11010.112を表すことができます。。固定小数点の利点は、標準のハードウェアで簡単に実装できることです。2つの固定小数点数を追加するには、整数であるかのように単純に追加します。2つの固定小数点数を乗算するには、整数のように乗算しますが、結果は基数の2倍の位置になるため、ビットをシフトしてこれを調整するか、次のようにコードを記述します。このような演算は、小数点以下の既知のビット数で解釈されます。一部のプロセッサには、この効果の乗算を調整することによって固定小数点をサポートする命令があります。
数値は整数にスケーリングすることもできます。たとえば、米国の通貨を使用するには、ドルの金額に100を掛けて、すべての算術演算を整数で実行します。小数点は、最終結果を表示するときにのみ挿入されます(そして、人間からデータを読み取るときに解釈されます)。もう1つの一般的なスケーリングは、255を掛けてピクセル強度(0から1)を表すことです。これにより、0から1までの小数部が8ビットバイトに収まります。
拡張精度(基本的な算術型のいくつかの単位を使用して追加の精度を提供する)または任意の精度(動的な数の単位を使用して必要なだけの精度を提供する)を提供するソフトウェアもあります。このようなソフトウェアは、ハードウェアでサポートされている演算に比べて非常に低速であり、通常は特別な目的でのみ使用されます。さらに、拡張精度には、基本的に浮動小数点と同じプロパティがあります。丸め誤差が小さく、なくなっていないだけです。任意精度にも同じ欠点がありますが、動的精度を使用すると、必要な間隔内の最終結果を取得できるようにエラーを十分に小さくすることができます(おそらく、そうしていることを証明できます)。
非整数を表す別の方法は、分数を使用することです。分子と分母を格納し、学校で教えられているのとほぼ同じ方法で算術を実行できます。分子と分母を乗算して乗算します。両方の分数を共通の分母を持つように変換して追加し、次に分子を追加します。この種の算術演算は、分母がすぐに大きくなるため問題があります。そのため、分母を管理するには、拡張精度または任意精度が必要です。
数値を記号的に、または複合式で表すこともできます。たとえば、2の平方根を数値として格納する代わりに、数値2に適用される平方根演算を表すデータ構造で格納できます。このような表現で最も単純な演算以外を実行するには、非常に複雑なソフトウェアが必要です。式を管理し、それらを組み合わせ、削減を見つけるなど。この種の表現は、MapleやMathematicaなどの特殊な数学ソフトウェアで使用されます。
最後に、任意の方法で数値を表すことができます。最新のプロセッサは、速度とストレージ容量の限界までの汎用コンピューティングデバイスであるため、文字列やデータ構造、またはその他の手法で数値を表すアルゴリズムを記述できます。
It is a massively complex subject and can require specialist hardware depending on the size of the precision involved.
The very basic answer is that it is a x bit variable - split up 3 ways -
For example a 32 bit FP would be:
1 bit for the sign (-/+)
8 bits for the exponent (power) of 10
23 bits for the significant numbers.
Think of Excel when you put a huge FP into a cell and it does something like 1.23E-01 - what this means is 1.23 multiplied by 10 to the power -1 - in other terms 0.123.
So in binary this would be: 01000000011110110000000000000000
Broken down:
0 = sign bit - positive
010000000 - exponent - one (edit: first bit is sign bit of exponent)
11110110000000000000000 - signifant figures of 123
Anyway this is really rough and my binary is rusty so someone please correct mistakes.
私が最近、いくつかの財務関連の作業をしていて、浮動小数点演算を行う必要があるのと同じトピックについて読んでいたのはおかしいです。すべてのコンピューター科学者が浮動小数点演算について知っておくべきことの記事を読むことを強くお勧めします
また、ソフトウェアのフローティングポイントに関するJoelSpolskyによるこの投稿もご覧ください。