2

JavaScript で次のことを行う必要がありますが、これまでシームレスに実行するためのソリューションを見つけることができませんでした:

  • 2 つの整数を特定の順序で取得し、Python の struct モジュールのようにパックします。
  • このパックされた値 (ホストとは異なるエンディアンをサポートするためのボーナス) は、64 ビット float (double) に変換されます。それらは任意である必要があるため、整数の指数表現を取得する可能性があります (たとえば、0xdeadbeef と 500 である可能性があります)。

    exp 形式: 1.0883076389305e-311 1.0883076389305000 * 10 ^ - 311

  • それを任意精度の非指数形式に変換する必要があるので、次のようにします。

    0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000108830763893050000000000000000000000000000000000000000000000000000000000000000000000000000

  • その数値は文字列に変換されました:)

Javascript でこれを行う方法が見つからず、任意の精度、または少なくとも倍精度の 1024 指数 (または、400) までのスケールをサポートする必要があるような数値を出力する必要があります。

ありがとう!!

注: double/64bit float に変換された 2 つの数値を忠実に表現するには、「packing/unpacking」が必要です。 double の任意精度の double 表現を取得しても問題ありません。

4

2 に答える 2

4

1: Khronos では、WebGL要件の一部としてインターフェイスの仕様が進行中です。これにより、2 つの int をバッファーに書き込み、doubleとして読み戻すことができます。DataViewTypedArrayInt32ArrayFloat64Array

残念ながら、これに対するブラウザーのサポートはまだ一般的ではありません。ブラウザーをテストするには、 http://html5test.com/にアクセスし、「ネイティブ バイナリ データ」というタイトルのセクションを参照してください。

上記のサポートがなければ、TypedArrayJavascript のビット演算子は数値を 32 ビットの符号なし値として扱うため、ビット操作を使用してこれを行う方法はないと思います。したがって、上位ビットにアクセスすることはできません。

2:double変数には特定の形式はありません。IEE754 は単なる内部表現です。

3:実際精度を示すことができるポイントです。残念ながら、たとえば などの組み込みメソッドは、Number.toFixed()小数点以下 20 桁を超える表示をサポートしていません。指数形式を解析し、適切な数の先行ゼロを含む文字列を手動で作成する必要があります。

注意 - double の指数範囲は 10^1024 ではなく 2^1024 であるため、実際の制限は実際には ~1.0E±308 です。例の数値はその範囲よりも小さくなっています。

編集実際には方法があるかもしれませんが、これの精度は保証できません:

  1. 2 つの整数を取り、それらhiを と と呼びますlo
  2. 指数を抽出する -exp = (hi >> 20) & 0x7ff
  3. 記号を抽出する -sign = (hi >> 31)
  4. 仮数を抽出します -((hi & 0xfffff) * Math.pow(2, 32) + lo) / Math.pow(2, 52)
  5. result = (1 + m) * (Math.pow(2.0, exp - 1023))
  6. if (sign) result *= -1

編集 2 - 動作します! http://jsfiddle.net/alnitak/assXS/を参照してください。

var hex2double = function(input) {

    var hi = parseInt(input.substring(0, 8), 16);
    var lo = parseInt(input.substring(8   ), 16);

    var p32 = 0x100000000;
    var p52 = 0x10000000000000;

    var exp = (hi >> 20) & 0x7ff;
    var sign = (hi >> 31);
    var m = 1 + ((hi & 0xfffff) * p32 + lo) / p52;
    m = exp ? (m + 1) : (m * 2.0);

    return (sign ? -1 : 1) * m * Math.pow(2, exp - 1023);
};

http://babbage.cs.qc.edu/IEEE-754/Decimal.htmlで浮動小数点数を入力し、出力の一番下の行から結果の 16 進文字列を取得して、上記の関数に渡します。元の値を含むアラートが表示されます。

指数ビットがすべてゼロの特殊なケースを考慮して修正されたEDIT 3コード。

于 2011-07-20T06:53:28.123 に答える
0

http://jsfromhell.com/classes/bignumberのような JavaScript 用の大きな数のライブラリが必要だと思います。

于 2011-07-20T07:25:07.623 に答える