получение дробной части значимого и знакового бита числа «javascript» NaN - PullRequest
0 голосов
/ 31 января 2019

Для значения NaN (например, показатель степени равен 11111111111) в javascript, есть ли способ получить бит знака и значащее значение (игнорируя неявный 1 бит)?

И если этоне в том случае, не означает ли это, что double (Number) в javascript не представляет 2^64 возможных состояний, скорее (2^64 - 2^52) возможных состояний?

1 Ответ

0 голосов
/ 01 февраля 2019

Как заметил еретик Обезьяна, в спецификации конкретно указано, что числа NaN в javascript все неразличимы -

"В некоторых реализациях внешний код может обнаруживать разницу между различными значениями Not-a-Number, но такое поведение зависит от реализации; для кода ECMAScript все значения NaN неотличимы друг от друга. "

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

Таким образом, похоже, что это невозможно - или, по крайней мере, невозможно в зависимости от платформы.

Одним из предложений было использование типизированных массивов.Кажется, это работает в IE и Chrome, но не в Firefox!Проблема в том, что когда вы сохраняете double в переменной, в 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();
...