// Copyright 2019 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Tests Number.prototype.toString for numbers within or near the subnormal // range, when the radix argument is 2. // A JavaScript number is a IEEE 754 binary64 (double-precision floating-point) // value, so we should be able to provide a binary string value that is an // exact representation. const zeros = count => '0'.repeat(count); const test = (binaryStringValue, double) => { assertEquals(binaryStringValue, double.toString(2)); }; // 2**-1074 test(`0.${zeros(1073)}1`, Number.MIN_VALUE); // Bug v8:9294 test(`0.${zeros(1022)}1101100011110111011100000100011001111101110001010111`, 1.8858070859709815e-308); test(`0.${zeros(1021)}11110111001111000110110111011101110001000000000000001`, 4.297800585227606e-308); // Normal doubles smaller than 2**-1021 (4.450147717014403e-308). These values // are not in the subnormal range, but like the subnormals they have a gap of // Number.MIN_VALUE between themselves and the next double. test(`0.${zeros(1021)}11100001110000011100111110011010010100100010001001001`, 3.924423154449847e-308); test(`-0.${zeros(1021)}11001101101111001101100010110110011000000011010111001`, -3.57641826104544e-308); test(`-0.${zeros(1021)}11101100100000100110110001000010010001001000101110001`, -4.1113361447183043e-308); test(`0.${zeros(1021)}11111001101000111100111001001101101001001011010001101`, 4.339587042263274e-308); test(`0.${zeros(1021)}10111011101001010010101011100001110000000001011110001`, 3.261909352323954e-308); test(`0.${zeros(1021)}10001001101101110110000110001011100001100111111111001`, 2.3939766453008923e-308); test(`-0.${zeros(1021)}11101001000110010001100111110111001001000001100010011`, -4.052034242003901e-308); test(`-0.${zeros(1021)}10001111010010000100000110100010101101001000110010101`, -2.4907311894031355e-308); test(`-0.${zeros(1021)}10101100001001010011101010001110011010000001111000001`, -2.9924709724070097e-308); test(`-0.${zeros(1021)}11111101001111010110001011001001000100110101001010111`, -4.402165887028534e-308); // Subnormal doubles: numbers smaller than 2**-1022 (2.2250738585072014e-308). test(`0.${zeros(1022)}1100111101100011000101110111111000011111110001001011`, 1.802545172319673e-308); test(`0.${zeros(1022)}1111001000101011101110111111011111111100111101101011`, 2.104874994274149e-308); test(`-0.${zeros(1022)}1001110011110110110010010010010001111100001111101011`, -1.3642832344349763e-308); test(`0.${zeros(1023)}111101010100011111101110111101011000001110011101101`, 1.0659537476238824e-308); test(`-0.${zeros(1023)}100101011110101100111101101001110011101011110111101`, -6.51524700064251e-309); test(`-0.${zeros(1024)}10011100110100110010111101001001111100000101000111`, -3.407686279964664e-309); test(`-0.${zeros(1024)}11101001001010000001101111010101011111111011010111`, -5.06631661953108e-309); test(`-0.${zeros(1024)}10111100111100001100010100110011001011000011011101`, -4.105533080656306e-309); test(`0.${zeros(1025)}1101111100101101111110101111001010101100001100111`, 2.42476131288505e-309); test(`-0.${zeros(1025)}1001000100011011100101010010101010101011101000111`, -1.576540281929606e-309); test(`0.${zeros(1023)}111101100001000000001011101011101010001110011111101`, 1.0693508455891784e-308); test(`0.${zeros(1024)}11100010101101001101011010110001110101110100010001`, 4.926157093545696e-309); test(`-0.${zeros(1027)}10010111100001111110000101011001010111100011011`, -4.1158103328176e-310); test(`0.${zeros(1030)}11111010010111010110101101000111010011100001`, 8.500372841691e-311); test(`0.${zeros(1033)}101001010011111001100100001010001101`, 7.01292938871e-312); test(`0.${zeros(1037)}11101010101101100111000110100111001`, 6.22574126804e-313); test(`-0.${zeros(1040)}10100001001101011011111001111111`, -5.3451064043e-314); test(`-0.${zeros(1043)}1001100101100100000001000011111`, -6.35731246e-315); test(`0.${zeros(1046)}10101110110100011010110001`, 9.05676893e-316); test(`-0.${zeros(1050)}11001010000110011100011`, -6.5438353e-317); test(`0.${zeros(1053)}111001010000010001`, 9.269185e-318); test(`-0.${zeros(1057)}1100001000010101`, -4.90953e-319); test(`-0.${zeros(1059)}10011001001111`, -9.6906e-320); test(`0.${zeros(1063)}111101111`, 9.782e-321); test(`0.${zeros(1067)}10011`, 3.75e-322); test(`-0.${zeros(1070)}1`, -4e-323);