0

私はEloquent JavaScriptを読んでいますが、この説明で「行き詰まり」ました。最初はスキップすると思っていましたが、戻ってきて理解できませんでした.64ビットの影響をグーグルで調べてみました.そのようなものですが、答えが見つかりませんでした。

私はいくつかのものを手に入れません.10^3?なぜそれは3桁の10進数に制限されているのですか? タイピング1.99999999999してみたところうまくいきました。この文をスキップせずに完全に理解できる場所はありますか? どこかで、javascript には近似の問題があることを読んだ2.000000000ことがありますが2.000000000001、それが問題を引き起こす可能性がありますが、本のこの部分は私には似ていないようです。

どんな助けでも感謝します。

この本では分からない部分です

This is what 144 looks like in bits:

0100000001100010000000000000000000000000000000000000000000000000

The number above has 64 bits. Numbers in JavaScript always do. This has one important repercussion: There is a limited amount of different numbers that can be expressed. With three decimal digits, only the numbers 0 to 999 can be written, which is 10^3 = 1000 different numbers. With 64 binary digits, 2^64 different numbers can be written. This is a lot, more than 10^19 (a one with nineteen zeroes).

Not all whole numbers below 10^19 fit in a JavaScript number though. For one, there are also negative numbers, so one of the bits has to be used to store the sign of the number. A bigger issue is that non-whole numbers must also be represented. To do this, 11 bits are used to store the position of the fractional dot within the number.

That leaves 52 bits. Any whole number less than 2^52 (which is more than 10^15) will safely fit in a JavaScript number. In most cases, the numbers we are using stay well below that, so we do not have to concern ourselves with bits at all. Which is good. I have nothing in particular against bits, but you do need a terrible lot of them to get anything done. When at all possible, it is more pleasant to deal with bigger things.
4

2 に答える 2

0

それは完全に単純です。コンソールを開き、次のように入力します。

0.1+0.2

これは0.30000000000000004JSによるものです。それが近似の問題です。これは、JS がfloatに IEEE 754仕様を使用しているためです。
そのトピックの詳細はこちら

10^3 はMath.pow(10,3)JS にあり、これは10*10*10または+('10' + '0' + '0')であり、これは 1000 です。したがって、3 つの 10 進数 (10 の可能な数字文字 (0-9)) により、000 から 999 ===> 1000 の範囲の 10*10*10 の組み合わせが可能になります。
JavaScript では 10 進数 3 桁に制限されていません。JavaScript は 64 ビットの数値を持ち、11 ビットを使用して小数点を配置します。

ここで「浮動小数点」という名前が手がかりです。10 進数のドットは浮動小数点にすることができます。固定数のビットを使用して整数を表し、固定数のビットを使用して非整数部分を指定する代わりに、次のようにします。

//pseudo: assume 16 bits
00000011 00000000

小数点が固定されている場合、これは 3 を表します (ビットの中央がポイントです)。これは理想的ではないため、ポイントの位置がJS で浮動する可能性があります。

//50 zeroes
...11 00000000000

最後の 11 ビットはドット位置を保持します。この場合3は整数であるため、小数点はありません。

と書いた場合2.999999、数値自体は整数で表されます (ビットは 1 または 0 のいずれかであり、その間はありません)。

1011011100011010111111

次に、最後の 11 ビットは次のようになります。

00000010100

これにより、浮動小数点が 20 番目の位置に移動します。

10[.]11011100011010111111

これにより、整数が10、または 2 になり、その後にドットが続きます。

そう?どうしたの?

シンプル: JS はその数値に 64 ビットを使用しますが、これらのビットの 1 つは負/正の数値に使用され、11 はポイントの位置に使用され、数値自体には 52 ビット、または2^520 と 1 の可能な組み合わせ (~10 ^15 の組み合わせ)

それ自体は十分に聞こえますが、ポイントは浮かんでいます。整数は確かに巨大になる可能性がありますが、10 進数を追加するたびに少しずつ取り除かれ、数値の可能な最大値をむしゃむしゃ食べます。

一般に、1 兆分の 1 を失うことは、1 兆分の 1 を失うことよりも害が少ないため、数値が大きくなるほど、浮動小数点が押し戻され、有効桁数 (精度) が失われます。必要です

于 2013-07-18T09:59:54.283 に答える
0

Repercussion は英語の文の一部に過ぎず、専門用語ではありません。「これには 1 つの重要な影響があります」は、単に、彼が話していることの重要な効果を指摘することを意味します。この場合、JavaScript は限られた数値の量であり、その量を計算できます。

10 の 3 乗 (つまり、10 の 3 乗) は 1000 です。これは基本的な数学です。彼はそれを例として、3 桁だけでいくつの数字を書き込めるかを説明しています (1000 は書き込めます。つまり、0 から 999 までのすべての数字です)。同様に、数字が 4 桁の場合、10 の 4 乗 (10,000、つまり 0 から 9999 までのすべての数字) を書くことができます。定義上、10 の累乗に基づく 10 進数システムを使用しているため、10 のべき乗です (それでも不明な場合は、10 進数、2 進数、16 進数、および 8 進数を参照してください)。コンピューティングで最もよく使用されます)。

それから彼は、javascript (および事実上すべてのプログラミング言語) の数体系が使用する 2 進数について話します。一方、10 進数は基数 10 です。繰り返しになりますが、表現できる数の量を知りたい場合は、基数を自分の桁数で累乗します。JavaScript は 64 バイナリ ('基数 2 ') 数字、2 の 64 乗を計算する必要がありますが、これはたまたま非常に大きな数になります。電卓または Google で試してみてください (検索ボックスに 2^64 を入力してください)。

しかし、彼が言うように、実際には、10 進数と負の数の格納方法のために、これらすべてが利用できるわけではありません。詳細に興味がある場合は、Charles Petzold著Code: The Hidden Language of Computer Hardware and Softwareという本を読むことをお勧めします。明るい面としては、良い JavaScript を書くために、JavaScript 数値システムの内部の詳細を知る必要はほとんどありません! しかし、すべての知識は良いです。

于 2013-07-18T10:07:59.390 に答える