@@ -78,6 +78,7 @@ class Struct {
78
78
"L" : "getUint32" ,
79
79
"q" : "getInt64" ,
80
80
"Q" : "getUint64" ,
81
+ "e" : "getFloat16" ,
81
82
"f" : "getFloat32" ,
82
83
"d" : "getFloat64"
83
84
}
@@ -93,6 +94,7 @@ class Struct {
93
94
"L" : 4 ,
94
95
"q" : 8 ,
95
96
"Q" : 8 ,
97
+ "e" : 2 ,
96
98
"f" : 4 ,
97
99
"d" : 8
98
100
}
@@ -165,7 +167,36 @@ var MIN_INT64 = -1n << 63n;
165
167
var MAX_UINT64 = 1n << 64n ;
166
168
var MIN_UINT64 = 0n ;
167
169
170
+
171
+ function decodeFloat16 ( low , high ) {
172
+ // decode IEEE 754 half-precision (2 bytes)
173
+ let sign = ( high & 0b10000000 ) >> 7 ;
174
+ let exponent = ( high & 0b01111100 ) >> 2 ;
175
+ let fraction = ( ( high & 0b00000011 ) << 8 ) + low ;
176
+
177
+ let magnitude ;
178
+ if ( exponent == 0b11111 ) {
179
+ magnitude = ( fraction == 0 ) ? Infinity : NaN ;
180
+ }
181
+ else if ( exponent == 0 ) {
182
+ magnitude = 2 ** - 14 * ( fraction / 1024 ) ;
183
+ }
184
+ else {
185
+ magnitude = 2 ** ( exponent - 15 ) * ( 1 + ( fraction / 1024 ) ) ;
186
+ }
187
+
188
+ return ( sign ) ? - magnitude : magnitude ;
189
+ }
190
+
168
191
export class DataView64 extends DataView {
192
+ getFloat16 ( byteOffset , littlEndian ) {
193
+ // little-endian by default
194
+ let bytes = [ this . getUint8 ( byteOffset ) , this . getUint8 ( byteOffset + 1 ) ]
195
+ if ( ! littlEndian ) bytes . reverse ( ) ;
196
+ let [ low , high ] = bytes ;
197
+ return decodeFloat16 ( low , high ) ;
198
+ }
199
+
169
200
getUint64 ( byteOffset , littleEndian ) {
170
201
// split 64-bit number into two 32-bit (4-byte) parts
171
202
const left = BigInt ( this . getUint32 ( byteOffset , littleEndian ) ) ;
0 commit comments