私は良い方法が分かりません。それは確かにここでは、ハードな方法を行うことができ、完全にはJavaScript内単精度の例です:
js> a = 0x41973333
1100428083
js> (a & 0x7fffff | 0x800000) * 1.0/Math.pow(2,23) * Math.pow(2, ((a>>23 & 0xff) - 127))
18.899999618530273
生産の実装では、フィールドのほとんどは一般的に何のための特別な解釈を指定することで実現し、魔法の値を持っていることを考慮すべきです最大であったか最小であったでしょうか。したがって、NaN
と無限を検出してください。上記の例では、ネガを確認する必要があります。 (a & 0x80000000)
更新:私は倍のためにもそれを持っています。内部JS表現が二重であるため、上記の手法を直接拡張することはできません。したがって、その定義によって、長さ52のビットストリングを処理することができ、32以上はシフトできません。
[OK]をダブルクリックすると、の下位8桁または32ビットの文字列としてが最初に切り捨てられます。それらを個別のオブジェクトで処理します。次に:
js> a = 0x40725082
1081233538
js> (a & 0xfffff | 0x100000) * 1.0/Math.pow(2, 52 - 32) * Math.pow(2, ((a >> 52 - 32 & 0x7ff) - 1023))
293.03173828125
js>
これはOPのものなので、上記の例はそのままです。より難しいケースは、低32ビットに値がある場合です。ここ0x40725082deadbeefの変換、完全な精度ダブルは以下のとおりです。
js> a = 0x40725082
1081233538
js> b = 0xdeadbeef
3735928559
js> e = (a >> 52 - 32 & 0x7ff) - 1023
8
js> (a & 0xfffff | 0x100000) * 1.0/Math.pow(2,52-32) * Math.pow(2, e) +
b * 1.0/Math.pow(2, 52) * Math.pow(2, e)
293.0319506442019
js>
あなたがくくり出すことはできますが、それは形式にどのように関連するか見ることができますので、私はそれをこのように残してきたいくつかの明白な部分式があります。
個人的には、正規表現を使って16進数の値を別々の部分に切り詰めることから始めます。次に、それらを整数として評価し、最後にそれらを浮動小数点数に戻そうとします。それは、Javascriptランタイムが途中でビットを失うことがないようにする必要があるので、難しいことになるようです。 – Pointy
最大限の移植性を実現するには、IEEE-754の倍音をビッグエンディアンまたはリトルエンディアンのいずれかにすることが重要です。どのコンベンションが16進数入力で使用されているか分かっているならば、pow()を使ったクライアント側の解決策は移植可能でなければなりません。何らかの型打ちアプローチを使用することに決めた場合、最初に倍精度のクライアントプラットフォームのエンディアンをチェックする必要があります。 –
@Jim Lewis:私には、大小のエンディアンを教えてくれる旗があります。 – Nosredna