From 3e29bf78c79155f39d4d27d570e700998c89a0b6 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 3 Nov 2022 19:40:05 -0400 Subject: [PATCH] Nicer constants. --- include/fast_float/float_common.h | 61 ++++++++++++++----------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/include/fast_float/float_common.h b/include/fast_float/float_common.h index 7f14914..f051667 100644 --- a/include/fast_float/float_common.h +++ b/include/fast_float/float_common.h @@ -220,7 +220,8 @@ constexpr static double powers_of_ten_double[] = { 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22}; constexpr static float powers_of_ten_float[] = {1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10}; - +// used for max_mantissa_double and max_mantissa_float +constexpr uint64_t constant_55555 = 5 * 5 * 5 * 5 * 5; // Largest integer value v so that (5**index * v) <= 1<<53. // 0x10000000000000 == 1 << 53 constexpr static uint64_t max_mantissa_double[] = { @@ -229,31 +230,25 @@ constexpr static uint64_t max_mantissa_double[] = { 0x10000000000000 / (5 * 5), 0x10000000000000 / (5 * 5 * 5), 0x10000000000000 / (5 * 5 * 5 * 5), - 0x10000000000000 / (5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (5 * 5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (5 * 5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (uint64_t(5) * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (uint64_t(5) * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (uint64_t(5) * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (uint64_t(5) * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (uint64_t(5) * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * - 5), - 0x10000000000000 / (uint64_t(5) * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * - 5 * 5), - 0x10000000000000 / (uint64_t(5) * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * - 5 * 5 * 5), - 0x10000000000000 / (uint64_t(5) * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * - 5 * 5 * 5 * 5), - 0x10000000000000 / (uint64_t(5) * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * - 5 * 5 * 5 * 5 * 5), - 0x10000000000000 / (uint64_t(5) * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * - 5 * 5 * 5 * 5 * 5 * 5)}; + 0x10000000000000 / (constant_55555), + 0x10000000000000 / (constant_55555 * 5), + 0x10000000000000 / (constant_55555 * 5 * 5), + 0x10000000000000 / (constant_55555 * 5 * 5 * 5), + 0x10000000000000 / (constant_55555 * 5 * 5 * 5 * 5), + 0x10000000000000 / (constant_55555 * constant_55555), + 0x10000000000000 / (constant_55555 * constant_55555 * 5), + 0x10000000000000 / (constant_55555 * constant_55555 * 5 * 5), + 0x10000000000000 / (constant_55555 * constant_55555 * 5 * 5 * 5), + 0x10000000000000 / (constant_5555constant_55555 * constant_55555), + 0x10000000000000 / (constant_5555constant_55555 * constant_55555 * 5), + 0x10000000000000 / (constant_5555constant_55555 * constant_55555 * 5 * 5), + 0x10000000000000 / (constant_5555constant_55555 * constant_55555 * 5 * 5 * 5), + 0x10000000000000 / (constant_5555constant_55555 * constant_55555 * 5 * 5 * 5 * 5), + 0x10000000000000 / (constant_5555constant_55555 * constant_55555 * constant_55555), + 0x10000000000000 / (constant_5555constant_55555 * constant_55555 * constant_55555 * 5), + 0x10000000000000 / (constant_5555constant_55555 * constant_55555 * constant_55555 * 5 * 5), + 0x10000000000000 / (constant_5555constant_55555 * constant_55555 * constant_55555 * 5 * 5 * 5), + 0x10000000000000 / (constant_5555constant_55555 * constant_55555 * constant_55555 * 5 * 5 * 5 * 5)}; // Largest integer value v so that (5**index * v) <= 1<<24. // 0x1000000 == 1<<24 constexpr static uint64_t max_mantissa_float[] = { @@ -262,13 +257,13 @@ constexpr static uint64_t max_mantissa_double[] = { 0x1000000 / (5 * 5), 0x1000000 / (5 * 5 * 5), 0x1000000 / (5 * 5 * 5 * 5), - 0x1000000 / (5 * 5 * 5 * 5 * 5), - 0x1000000 / (5 * 5 * 5 * 5 * 5 * 5), - 0x1000000 / (5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x1000000 / (5 * 5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x1000000 / (5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x1000000 / (5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5), - 0x1000000 / (5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5)}; + 0x1000000 / (constant_55555), + 0x1000000 / (constant_55555 * 5), + 0x1000000 / (constant_55555 * 5 * 5), + 0x1000000 / (constant_55555 * 5 * 5 * 5), + 0x1000000 / (constant_55555 * 5 * 5 * 5 * 5), + 0x1000000 / (constant_55555 * constant_55555), + 0x1000000 / (constant_55555 * constant_55555 * 5)}; template struct binary_format { using equiv_uint = typename std::conditional::type;