在JavaScript中,将浮点数转换为其二进制表示的最简单方法是什么?(例如1.0 -> 0x3F800000)。
我尝试手动实现,这对于通常的数字来说可以工作,但它在非常大或非常小的数字(没有范围检查)和特殊情况(NaN,infinity等)上失败:
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);
}
我仍然不确定这是否完全正确,但它似乎足够好地工作。 (我仍在寻找现有的实现方案)。
指数 < -126
)返回无穷大;我不认为这是你想要的。 (此外,-0.0最终会出现错误的符号位,但也许对于你的应用程序来说这并不重要。) - Mark Dickinsonatan2(flt, -1.0)
的结果(如果JavaScript提供了copysign,那将是更好的方法)。 - Mark Dickinson