function shouldBe(actual, expected) { if (actual !== expected) throw new Error(`bad value: expected:(${expected}),actual:(${actual})`); } function expected(num, radix) { let characters = "0123456789abcdefghijklmnopqrstuvwxyz"; let result = ""; let negative = false; if (num < 0) { negative = true; num = -num; } do { const index = num % radix; result = characters[index] + result; num = (num - index) / radix; } while (num); if (negative) return '-' + result; return result; } { function int32ToString(num) { return num.toString(16); } noInline(int32ToString); for (var i = 0; i < 1e3; ++i) { shouldBe(int32ToString(i), expected(i, 16)); shouldBe(int32ToString(-i), expected(-i, 16)); } shouldBe(int32ToString(0xffffffffff), expected(0xffffffffff, 16)); shouldBe(int32ToString(0.1), `0.1999999999999a`); shouldBe(int32ToString(-0.1), `-0.1999999999999a`); shouldBe(int32ToString(new Number(0xff)), `ff`); } { function int52ToString(num) { return fiatInt52(num).toString(16); } noInline(int52ToString); for (var i = 0; i < 1e3; ++i) { shouldBe(int52ToString(0xffffffff + i), expected(0xffffffff + i, 16)); shouldBe(int52ToString(-(0xffffffff + i)), expected(-(0xffffffff + i), 16)); } shouldBe(int52ToString(0xff), `ff`); shouldBe(int52ToString(0.1), `0.1999999999999a`); shouldBe(int52ToString(-0.1), `-0.1999999999999a`); shouldBe(int52ToString(new Number(0xff)), `ff`); } { function doubleToString(num) { return num.toString(16); } noInline(doubleToString); for (var i = 0; i < 1e3; ++i) { shouldBe(doubleToString(1.01), `1.028f5c28f5c29`); shouldBe(doubleToString(-1.01), `-1.028f5c28f5c29`); } shouldBe(doubleToString(0xff), `ff`); shouldBe(doubleToString(0.1), `0.1999999999999a`); shouldBe(doubleToString(-0.1), `-0.1999999999999a`); shouldBe(doubleToString(new Number(0xff)), `ff`); }