首页 > 解决方案 > 获取有效数字的小数部分和“the”javascript数字NaN的符号位

问题描述

对于NaNjavascript 中的一个值(例如指数是 11111111111),有没有办法获取符号位和有效值(忽略隐含的 1 位)?

如果不是这种情况,这是否意味着double (Number)javascript 中的 a 不代表2^64可能的状态,而是 ( 2^64 - 2^52) 可能的状态?

标签: javascriptfloating-pointdouble

解决方案


正如 Heretic Monkey 指出的那样,规范明确指出 javascript 中的 NaN 数字都是无法区分的 -

“在某些实现中,外部代码可能能够检测各种非数字值之间的差异,但这种行为取决于实现;对于 ECMAScript 代码,所有 NaN 值彼此无法区分。”

https://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types-number-type

所以看起来这是不可能的 - 或者至少以独立于平台的方式不可能。

一个建议是使用类型化数组。这似乎在 IE 和 Chrome 中有效,但在 Firefox 中无效!问题是当您将双精度值存储在变量中时,在 Firefox 中它将丢失您为 NaN 值设置的所有位模式......

var buffer = new ArrayBuffer(8);
var floats = new Float64Array(buffer);
var bytes = new Uint8Array(buffer);

floats[0] = NaN;

var print_float_bytes = function() {
  var pstr = "";
  for (var i = 0; i < 8; i += 1) {
    pstr = pstr + " " + bytes[i];
  }

  console.log(pstr);
};

console.log("printing a fresh NaN");
print_float_bytes();

bytes[7] = 255;
console.log("printing a NaN with the sign bit as 1");
print_float_bytes();

bytes[0] = 1;
console.log("printing a NaN with the significand as a number slightly bigger than 1 and a positive sign");
print_float_bytes();

console.log("printing the floating point number: " + floats[0]);

var p = floats[0];
floats[0] = p;

console.log("printing roundtripped NaN");
print_float_bytes();

var pointless = function(pdbl) {
  return pdbl;
};

p = floats[0];
p = pointless(p);

floats[0] = p;

console.log("printing even more roundtripped NaN");
print_float_bytes();


推荐阅读