2014-01-22 3 views
4

Я нашел код из here, который преобразует номер Javascript для внутреннего IEEE представления в виде двух значений uint32:Преобразование двух значений Uint32Array для Javascript числа

function DoubleToIEEE(f) 
{ 
    var buf = new ArrayBuffer(8); 
    (new Float64Array(buf))[0] = f; 
    return [ (new Uint32Array(buf))[0] ,(new Uint32Array(buf))[1] ]; 
} 

Как преобразовать возвращаемое значение обратно на номер JavaScript? Таким образом:

var number = -10.3245535; 
var ieee = DoubleToIEEE(number) 
var number_again = IEEEtoDouble(ieee); 
// number and number_again should be the same (if ever possible) 

ответ

2

Этот код некрасиво, как ад. Используйте

function DoubleToIEEE(f) { 
    var buf = new ArrayBuffer(8); 
    var float = new Float64Array(buf); 
    var uint = new Uint32Array(buf); 
    float[0] = f; 
    return uint; 
} 

Если вы хотите реально Array вместо Uint32Array (не следует делать различие в большинстве случаев), добавить Array.from вызова. Вы также можете уменьшить это к Oneliner, передавая значение в Float64Array конструктора:

function DoubleToIEEE(f) { 
    // use either 
    return new Uint32Array(Float64Array.of(f).buffer); 
    return Array.from(new Uint32Array(Float64Array.of(f).buffer)); 
    return Array.from(new Uint32Array((new Float64Array([f])).buffer)); 
} 

Обратные бы просто написать входы в uint слоты и вернуть float[0] значения:

function IEEEToDouble(is) { 
    var buf = new ArrayBuffer(8); 
    var float = new Float64Array(buf); 
    var uint = new Uint32Array(buf); 
    uint[0] = is[0]; 
    uint[1] = is[1]; 
    return float[0]; 
} 

, который может укоротить до

function IEEEToDouble(is) { 
    return (new Float64Array(Uint32Array.from(is).buffer))[0]; 
} 
+0

Спасибо! Кажется, нужно работать: http://jsbin.com/xuzayenuqu/edit?js,output –

+0

Не могли бы вы любезно объяснить нам манекены, почему код уродливый? –

+0

@ TimoKähkönen Присвоение пустующему типе с левой стороны сбивает с толку, лучше написать его явно с переменной. И два 'Uint32Array', где один был бы достаточным, выглядят неэффективными. Все это затрудняет понимание потока данных и находит обратную функцию. И, конечно, я предпочитаю формы с одним выражением :-) – Bergi

3

Я нашел возможное решение, которое, кажется, работает:

function IEEEToDouble(f) 
{ 
    var buffer = new ArrayBuffer(8); 
    (new Uint32Array(buffer))[0] = f[0]; 
    (new Uint32Array(buffer))[1] = f[1]; 
    return new Float64Array(buffer)[0]; 
} 

Использование:

var a = DoubleToIEEE(-0.1234); 
console.log(a); // [0, 3220176896] 
var b = IEEEToDouble(a); 
console.log(b); // -0.1234 
Смежные вопросы