Javascriptで浮動小数点数をバイナリ表現に変換する最も簡単な方法は何ですか? (例: 1.0 -> 0x3F800000)。
私は手動で実行しようとしましたが、これはある程度 (通常の数値で) 機能しますが、非常に大きいまたは非常に小さい数値 (範囲チェックなし) および特殊なケース (NaN、無限大など) では失敗します。
function floatToNumber(flt)
{
var sign = (flt < 0) ? 1 : 0;
flt = Math.abs(flt);
var exponent = Math.floor(Math.log(flt) / Math.LN2);
var mantissa = flt / Math.pow(2, exponent);
return (sign << 31) | ((exponent + 127) << 23) | ((mantissa * Math.pow(2, 23)) & 0x7FFFFF);
}
車輪の再発明ですか?
編集:私は自分のバージョンを改善しました。今では特別なケースを処理します。
function assembleFloat(sign, exponent, mantissa)
{
return (sign << 31) | (exponent << 23) | (mantissa);
}
function floatToNumber(flt)
{
if (isNaN(flt)) // Special case: NaN
return assembleFloat(0, 0xFF, 0x1337); // Mantissa is nonzero for NaN
var sign = (flt < 0) ? 1 : 0;
flt = Math.abs(flt);
if (flt == 0.0) // Special case: +-0
return assembleFloat(sign, 0, 0);
var exponent = Math.floor(Math.log(flt) / Math.LN2);
if (exponent > 127 || exponent < -126) // Special case: +-Infinity (and huge numbers)
return assembleFloat(sign, 0xFF, 0); // Mantissa is zero for +-Infinity
var mantissa = flt / Math.pow(2, exponent);
return assembleFloat(sign, exponent + 127, (mantissa * Math.pow(2, 23)) & 0x7FFFFF);
}
これが 100% 正しく機能するかどうかはまだわかりませんが、十分に機能しているようです。(私はまだ既存の実装を探しています)。