-
-
Notifications
You must be signed in to change notification settings - Fork 813
/
Copy pathindex.js
81 lines (70 loc) · 1.7 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
'use strict';
var randu = require( '@stdlib/math/base/random/randu' );
var round = require( '@stdlib/math/base/special/round' );
var pow = require( '@stdlib/math/base/special/pow' );
var abs = require( '@stdlib/math/base/special/abs' );
var SMALLEST_NORMAL = require( '@stdlib/math/constants/float64-smallest-normal' );
var BIAS = require( '@stdlib/math/constants/float64-exponent-bias' );
var toBinaryString = require( './../lib' );
var frac;
var sign;
var exp;
var b;
var x;
var i;
// Convert random numbers to literal bit representations...
for ( i = 0; i < 100; i++ ) {
if ( randu() < 0.5 ) {
sign = -1.0;
} else {
sign = 1.0;
}
frac = randu() * 10.0;
exp = round( randu()*100.0 );
if ( randu() < 0.5 ) {
exp = -exp;
}
x = sign * frac * pow( 2.0, exp );
b = toBinaryString( x );
log( x, b );
}
function log( x, b ) {
var sign;
var frac;
var tmp;
var exp;
console.log( '%d => %s', x, b );
tmp = b.substring( 0, 1 );
sign = ( tmp === '1' ) ? -1.0 : 1.0;
console.log( 'sign: %s', tmp );
tmp = b.substring( 1, 12 );
exp = parseInt( tmp, 2 ) - BIAS;
console.log( 'exp: %s => %d', tmp, exp );
tmp = b.substring( 12 );
frac = parseInt( tmp, 2 );
console.log( 'frac: %s => %d', tmp, frac );
frac = tmp;
if ( abs(x) < SMALLEST_NORMAL ) {
frac = '0.' + frac;
exp = 1 - BIAS; // subnormals are special
} else {
frac = '1.' + frac;
}
x = sign * frac2double( frac ) * pow( 2.0, exp );
console.log( '%d*%s*2^%d = %d\n', sign, frac, exp, x );
}
function frac2double( frac ) {
var sum;
var i;
if ( frac[ 0 ] === '1' ) {
sum = 1.0; // 2^0
} else {
sum = 0.0; // subnormals
}
for ( i = 2; i < frac.length; i++ ) {
if ( frac[ i ] === '1' ) {
sum += pow( 2.0, -(i-1) );
}
}
return sum;
}