1'use strict'; 2 3require('../common'); 4const assert = require('assert'); 5 6// Test (64 bit) double 7const buffer = Buffer.allocUnsafe(8); 8 9buffer[0] = 0x55; 10buffer[1] = 0x55; 11buffer[2] = 0x55; 12buffer[3] = 0x55; 13buffer[4] = 0x55; 14buffer[5] = 0x55; 15buffer[6] = 0xd5; 16buffer[7] = 0x3f; 17assert.strictEqual(buffer.readDoubleBE(0), 1.1945305291680097e+103); 18assert.strictEqual(buffer.readDoubleLE(0), 0.3333333333333333); 19 20buffer[0] = 1; 21buffer[1] = 0; 22buffer[2] = 0; 23buffer[3] = 0; 24buffer[4] = 0; 25buffer[5] = 0; 26buffer[6] = 0xf0; 27buffer[7] = 0x3f; 28assert.strictEqual(buffer.readDoubleBE(0), 7.291122019655968e-304); 29assert.strictEqual(buffer.readDoubleLE(0), 1.0000000000000002); 30 31buffer[0] = 2; 32assert.strictEqual(buffer.readDoubleBE(0), 4.778309726801735e-299); 33assert.strictEqual(buffer.readDoubleLE(0), 1.0000000000000004); 34 35buffer[0] = 1; 36buffer[6] = 0; 37buffer[7] = 0; 38// eslint-disable-next-line no-loss-of-precision 39assert.strictEqual(buffer.readDoubleBE(0), 7.291122019556398e-304); 40assert.strictEqual(buffer.readDoubleLE(0), 5e-324); 41 42buffer[0] = 0xff; 43buffer[1] = 0xff; 44buffer[2] = 0xff; 45buffer[3] = 0xff; 46buffer[4] = 0xff; 47buffer[5] = 0xff; 48buffer[6] = 0x0f; 49buffer[7] = 0x00; 50assert.ok(Number.isNaN(buffer.readDoubleBE(0))); 51assert.strictEqual(buffer.readDoubleLE(0), 2.225073858507201e-308); 52 53buffer[6] = 0xef; 54buffer[7] = 0x7f; 55assert.ok(Number.isNaN(buffer.readDoubleBE(0))); 56assert.strictEqual(buffer.readDoubleLE(0), 1.7976931348623157e+308); 57 58buffer[0] = 0; 59buffer[1] = 0; 60buffer[2] = 0; 61buffer[3] = 0; 62buffer[4] = 0; 63buffer[5] = 0; 64buffer[6] = 0xf0; 65buffer[7] = 0x3f; 66assert.strictEqual(buffer.readDoubleBE(0), 3.03865e-319); 67assert.strictEqual(buffer.readDoubleLE(0), 1); 68 69buffer[6] = 0; 70buffer[7] = 0x40; 71assert.strictEqual(buffer.readDoubleBE(0), 3.16e-322); 72assert.strictEqual(buffer.readDoubleLE(0), 2); 73 74buffer[7] = 0xc0; 75assert.strictEqual(buffer.readDoubleBE(0), 9.5e-322); 76assert.strictEqual(buffer.readDoubleLE(0), -2); 77 78buffer[6] = 0x10; 79buffer[7] = 0; 80assert.strictEqual(buffer.readDoubleBE(0), 2.0237e-320); 81assert.strictEqual(buffer.readDoubleLE(0), 2.2250738585072014e-308); 82 83buffer[6] = 0; 84assert.strictEqual(buffer.readDoubleBE(0), 0); 85assert.strictEqual(buffer.readDoubleLE(0), 0); 86assert.ok(1 / buffer.readDoubleLE(0) >= 0); 87 88buffer[7] = 0x80; 89assert.strictEqual(buffer.readDoubleBE(0), 6.3e-322); 90assert.strictEqual(buffer.readDoubleLE(0), -0); 91assert.ok(1 / buffer.readDoubleLE(0) < 0); 92 93buffer[6] = 0xf0; 94buffer[7] = 0x7f; 95assert.strictEqual(buffer.readDoubleBE(0), 3.0418e-319); 96assert.strictEqual(buffer.readDoubleLE(0), Infinity); 97 98buffer[7] = 0xff; 99assert.strictEqual(buffer.readDoubleBE(0), 3.04814e-319); 100assert.strictEqual(buffer.readDoubleLE(0), -Infinity); 101 102['readDoubleLE', 'readDoubleBE'].forEach((fn) => { 103 104 // Verify that default offset works fine. 105 buffer[fn](undefined); 106 buffer[fn](); 107 108 ['', '0', null, {}, [], () => {}, true, false].forEach((off) => { 109 assert.throws( 110 () => buffer[fn](off), 111 { code: 'ERR_INVALID_ARG_TYPE' } 112 ); 113 }); 114 115 [Infinity, -1, 1].forEach((offset) => { 116 assert.throws( 117 () => buffer[fn](offset), 118 { 119 code: 'ERR_OUT_OF_RANGE', 120 name: 'RangeError', 121 message: 'The value of "offset" is out of range. ' + 122 `It must be >= 0 and <= 0. Received ${offset}` 123 }); 124 }); 125 126 assert.throws( 127 () => Buffer.alloc(1)[fn](1), 128 { 129 code: 'ERR_BUFFER_OUT_OF_BOUNDS', 130 name: 'RangeError', 131 message: 'Attempt to access memory outside buffer bounds' 132 }); 133 134 [NaN, 1.01].forEach((offset) => { 135 assert.throws( 136 () => buffer[fn](offset), 137 { 138 code: 'ERR_OUT_OF_RANGE', 139 name: 'RangeError', 140 message: 'The value of "offset" is out of range. ' + 141 `It must be an integer. Received ${offset}` 142 }); 143 }); 144}); 145