gcc/libgcc/config/libbid/bid128.c
H.J. Lu b2a00c8984 Makefile.in (dfp-filenames): Replace decimal_globals...
libgcc/

2007-09-27  H.J. Lu  <hongjiu.lu@intel.com>

	* Makefile.in (dfp-filenames): Replace decimal_globals,
	decimal_data, binarydecimal and convert_data with
	bid_decimal_globals, bid_decimal_data, bid_binarydecimal
	and bid_convert_data, respectively.

libgcc/config/libbid/

2007-09-27  H.J. Lu  <hongjiu.lu@intel.com>

	* bid128_fromstring.c: Removed.

	* bid_dpd.c: New from libbid 2007-09-26.
	* bid128_to_int16.c: Likewise.
	* bid128_to_int8.c: Likewise.
	* bid128_to_uint8.c: Likewise.
	* bid128_to_uint16.c: Likewise.
	* bid64_to_int16.c: Likewise.
	* bid64_to_int8.c: Likewise.
	* bid64_to_uint16.c: Likewise.
	* bid64_to_uint8.c: Likewise.

	* bid128_2_str.h: Updated from libbid 2007-09-26.
	* bid128_2_str_macros.h: Likewise.
	* bid128_2_str_tables.c: Likewise.
	* bid128_add.c: Likewise.
	* bid128.c: Likewise.
	* bid128_compare.c: Likewise.
	* bid128_div.c: Likewise.
	* bid128_fma.c: Likewise.
	* bid128_logb.c: Likewise.
	* bid128_minmax.c: Likewise.
	* bid128_mul.c: Likewise.
	* bid128_next.c: Likewise.
	* bid128_noncomp.c: Likewise.
	* bid128_quantize.c: Likewise.
	* bid128_rem.c: Likewise.
	* bid128_round_integral.c: Likewise.
	* bid128_scalb.c: Likewise.
	* bid128_sqrt.c: Likewise.
	* bid128_string.c: Likewise.
	* bid128_to_int32.c: Likewise.
	* bid128_to_int64.c: Likewise.
	* bid128_to_uint32.c: Likewise.
	* bid128_to_uint64.c: Likewise.
	* bid32_to_bid128.c: Likewise.
	* bid32_to_bid64.c: Likewise.
	* bid64_add.c: Likewise.
	* bid64_compare.c: Likewise.
	* bid64_div.c: Likewise.
	* bid64_fma.c: Likewise.
	* bid64_logb.c: Likewise.
	* bid64_minmax.c: Likewise.
	* bid64_mul.c: Likewise.
	* bid64_next.c: Likewise.
	* bid64_noncomp.c: Likewise.
	* bid64_quantize.c: Likewise.
	* bid64_rem.c: Likewise.
	* bid64_round_integral.c: Likewise.
	* bid64_scalb.c: Likewise.
	* bid64_sqrt.c: Likewise.
	* bid64_string.c: Likewise.
	* bid64_to_bid128.c: Likewise.
	* bid64_to_int32.c: Likewise.
	* bid64_to_int64.c: Likewise.
	* bid64_to_uint32.c: Likewise.
	* bid64_to_uint64.c: Likewise.
	* bid_b2d.h: Likewise.
	* bid_binarydecimal.c: Likewise.
	* bid_conf.h: Likewise.
	* bid_convert_data.c: Likewise.
	* bid_decimal_data.c: Likewise.
	* bid_decimal_globals.c: Likewise.
	* bid_div_macros.h: Likewise.
	* bid_flag_operations.c: Likewise.
	* bid_from_int.c: Likewise.
	* bid_functions.h: Likewise.
	* bid_gcc_intrinsics.h: Likewise.
	* bid_inline_add.h: Likewise.
	* bid_internal.h: Likewise.
	* bid_round.c: Likewise.
	* bid_sqrt_macros.h: Likewise.
	* _addsub_dd.c: Likewise.
	* _addsub_sd.c: Likewise.
	* _addsub_td.c: Likewise.
	* _dd_to_df.c: Likewise.
	* _dd_to_di.c: Likewise.
	* _dd_to_sd.c: Likewise.
	* _dd_to_sf.c: Likewise.
	* _dd_to_si.c: Likewise.
	* _dd_to_td.c: Likewise.
	* _dd_to_tf.c: Likewise.
	* _dd_to_udi.c: Likewise.
	* _dd_to_usi.c: Likewise.
	* _dd_to_xf.c: Likewise.
	* _df_to_dd.c: Likewise.
	* _df_to_sd.c: Likewise.
	* _df_to_td.c: Likewise.
	* _di_to_dd.c: Likewise.
	* _di_to_sd.c: Likewise.
	* _di_to_td.c: Likewise.
	* _div_dd.c: Likewise.
	* _div_sd.c: Likewise.
	* _div_td.c: Likewise.
	* _eq_dd.c: Likewise.
	* _eq_sd.c: Likewise.
	* _eq_td.c: Likewise.
	* _ge_dd.c: Likewise.
	* _ge_sd.c: Likewise.
	* _ge_td.c: Likewise.
	* _gt_dd.c: Likewise.
	* _gt_sd.c: Likewise.
	* _gt_td.c: Likewise.
	* _isinfd128.c: Likewise.
	* _isinfd32.c: Likewise.
	* _isinfd64.c: Likewise.
	* _le_dd.c: Likewise.
	* _le_sd.c: Likewise.
	* _le_td.c: Likewise.
	* _lt_dd.c: Likewise.
	* _lt_sd.c: Likewise.
	* _lt_td.c: Likewise.
	* _mul_dd.c: Likewise.
	* _mul_sd.c: Likewise.
	* _mul_td.c: Likewise.
	* _ne_dd.c: Likewise.
	* _ne_sd.c: Likewise.
	* _ne_td.c: Likewise.
	* _sd_to_dd.c: Likewise.
	* _sd_to_df.c: Likewise.
	* _sd_to_di.c: Likewise.
	* _sd_to_sf.c: Likewise.
	* _sd_to_si.c: Likewise.
	* _sd_to_td.c: Likewise.
	* _sd_to_tf.c: Likewise.
	* _sd_to_udi.c: Likewise.
	* _sd_to_usi.c: Likewise.
	* _sd_to_xf.c: Likewise.
	* _sf_to_dd.c: Likewise.
	* _sf_to_sd.c: Likewise.
	* _sf_to_td.c: Likewise.
	* _si_to_dd.c: Likewise.
	* _si_to_sd.c: Likewise.
	* _si_to_td.c: Likewise.
	* _td_to_dd.c: Likewise.
	* _td_to_df.c: Likewise.
	* _td_to_di.c: Likewise.
	* _td_to_sd.c: Likewise.
	* _td_to_sf.c: Likewise.
	* _td_to_si.c: Likewise.
	* _td_to_tf.c: Likewise.
	* _td_to_udi.c: Likewise.
	* _td_to_usi.c: Likewise.
	* _td_to_xf.c: Likewise.
	* _tf_to_dd.c: Likewise.
	* _tf_to_sd.c: Likewise.
	* _tf_to_td.c: Likewise.
	* _udi_to_dd.c: Likewise.
	* _udi_to_sd.c: Likewise.
	* _udi_to_td.c: Likewise.
	* _unord_dd.c: Likewise.
	* _unord_sd.c: Likewise.
	* _unord_td.c: Likewise.
	* _usi_to_dd.c: Likewise.
	* _usi_to_sd.c: Likewise.
	* _usi_to_td.c: Likewise.
	* _xf_to_dd.c: Likewise.
	* _xf_to_sd.c: Likewise.
	* _xf_to_td.c: Likewise.

2007-09-27  H.J. Lu  <hongjiu.lu@intel.com>

	* b2d.h: Renamed to ...
	* bid_b2d.h: This.

	* bid128_to_string.c: Renamed to ...
	* bid128_string.c: This.

	* bid_intrinsics.h: Renamed to ...
	* bid_gcc_intrinsics.h: This.

	* bid_string.c: Renamed to ...
	* bid64_string.c: This.

	* binarydecimal.c: Renamed to ...
	* bid_decimal_globals.c: This.

	* convert_data.c: Renamed to ...
	* bid_convert_data.c: This.

	* decimal_data.c: Renamed to ...
	* bid_decimal_data.c: This.

	* decimal_globals.c: Renamed to ...
	* bid_decimal_globals.c: This.

	* div_macros.h: Renamed to ...
	* bid_div_macros.h: This.

	* inline_bid_add.h: Renamed to ...
	* bid_inline_add.h: This.

	* sqrt_macros.h: Renamed to ...
	* bid_sqrt_macros.h: This.

From-SVN: r128841
2007-09-27 10:47:23 -07:00

4339 lines
151 KiB
C

/* Copyright (C) 2007 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
In addition to the permissions in the GNU General Public License, the
Free Software Foundation gives you unlimited permission to link the
compiled version of this file into combinations with other programs,
and to distribute those combinations without any restriction coming
from the use of this file. (The General Public License restrictions
do apply in other respects; for example, they cover modification of
the file, and distribution when not linked into a combine
executable.)
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
#include "bid_internal.h"
// the first entry of nr_digits[i - 1] (where 1 <= i <= 113), indicates
// the number of decimal digits needed to represent a binary number with i bits;
// however, if a binary number of i bits may require either k or k + 1 decimal
// digits, then the first entry of nr_digits[i - 1] is 0; in this case if the
// number is less than the value represented by the second and third entries
// concatenated, then the number of decimal digits k is the fourth entry, else
// the number of decimal digits is the fourth entry plus 1
DEC_DIGITS nr_digits[] = { // only the first entry is used if it is not 0
{1, 0x0000000000000000ULL, 0x000000000000000aULL, 1}
, // 1-bit n < 10^1
{1, 0x0000000000000000ULL, 0x000000000000000aULL, 1}
, // 2-bit n < 10^1
{1, 0x0000000000000000ULL, 0x000000000000000aULL, 1}
, // 3-bit n < 10^1
{0, 0x0000000000000000ULL, 0x000000000000000aULL, 1}
, // 4-bit n ? 10^1
{2, 0x0000000000000000ULL, 0x0000000000000064ULL, 2}
, // 5-bit n < 10^2
{2, 0x0000000000000000ULL, 0x0000000000000064ULL, 2}
, // 6-bit n < 10^2
{0, 0x0000000000000000ULL, 0x0000000000000064ULL, 2}
, // 7-bit n ? 10^2
{3, 0x0000000000000000ULL, 0x00000000000003e8ULL, 3}
, // 8-bit n < 10^3
{3, 0x0000000000000000ULL, 0x00000000000003e8ULL, 3}
, // 9-bit n < 10^3
{0, 0x0000000000000000ULL, 0x00000000000003e8ULL, 3}
, // 10-bit n ? 10^3
{4, 0x0000000000000000ULL, 0x0000000000002710ULL, 4}
, // 11-bit n < 10^4
{4, 0x0000000000000000ULL, 0x0000000000002710ULL, 4}
, // 12-bit n < 10^4
{4, 0x0000000000000000ULL, 0x0000000000002710ULL, 4}
, // 13-bit n < 10^4
{0, 0x0000000000000000ULL, 0x0000000000002710ULL, 4}
, // 14-bit n ? 10^4
{5, 0x0000000000000000ULL, 0x00000000000186a0ULL, 5}
, // 15-bit n < 10^5
{5, 0x0000000000000000ULL, 0x00000000000186a0ULL, 5}
, // 16-bit n < 10^5
{0, 0x0000000000000000ULL, 0x00000000000186a0ULL, 5}
, // 17-bit n ? 10^5
{6, 0x0000000000000000ULL, 0x00000000000f4240ULL, 6}
, // 18-bit n < 10^6
{6, 0x0000000000000000ULL, 0x00000000000f4240ULL, 6}
, // 19-bit n < 10^6
{0, 0x0000000000000000ULL, 0x00000000000f4240ULL, 6}
, // 20-bit n ? 10^6
{7, 0x0000000000000000ULL, 0x0000000000989680ULL, 7}
, // 21-bit n < 10^7
{7, 0x0000000000000000ULL, 0x0000000000989680ULL, 7}
, // 22-bit n < 10^7
{7, 0x0000000000000000ULL, 0x0000000000989680ULL, 7}
, // 23-bit n < 10^7
{0, 0x0000000000000000ULL, 0x0000000000989680ULL, 7}
, // 24-bit n ? 10^7
{8, 0x0000000000000000ULL, 0x0000000005f5e100ULL, 8}
, // 25-bit n < 10^8
{8, 0x0000000000000000ULL, 0x0000000005f5e100ULL, 8}
, // 26-bit n < 10^8
{0, 0x0000000000000000ULL, 0x0000000005f5e100ULL, 8}
, // 27-bit n ? 10^8
{9, 0x0000000000000000ULL, 0x000000003b9aca00ULL, 9}
, // 28-bit n < 10^9
{9, 0x0000000000000000ULL, 0x000000003b9aca00ULL, 9}
, // 29-bit n < 10^9
{0, 0x0000000000000000ULL, 0x000000003b9aca00ULL, 9}
, // 30-bit n ? 10^9
{10, 0x0000000000000000ULL, 0x00000002540be400ULL, 10}
, // 31-bit n < 10^10
{10, 0x0000000000000000ULL, 0x00000002540be400ULL, 10}
, // 32-bit n < 10^10
{10, 0x0000000000000000ULL, 0x00000002540be400ULL, 10}
, // 33-bit n < 10^10
{0, 0x0000000000000000ULL, 0x00000002540be400ULL, 10}
, // 34-bit n ? 10^10
{11, 0x0000000000000000ULL, 0x000000174876e800ULL, 11}
, // 35-bit n < 10^11
{11, 0x0000000000000000ULL, 0x000000174876e800ULL, 11}
, // 36-bit n < 10^11
{0, 0x0000000000000000ULL, 0x000000174876e800ULL, 11}
, // 37-bit n ? 10^11
{12, 0x0000000000000000ULL, 0x000000e8d4a51000ULL, 12}
, // 38-bit n < 10^12
{12, 0x0000000000000000ULL, 0x000000e8d4a51000ULL, 12}
, // 39-bit n < 10^12
{0, 0x0000000000000000ULL, 0x000000e8d4a51000ULL, 12}
, // 40-bit n ? 10^12
{13, 0x0000000000000000ULL, 0x000009184e72a000ULL, 13}
, // 41-bit n < 10^13
{13, 0x0000000000000000ULL, 0x000009184e72a000ULL, 13}
, // 42-bit n < 10^13
{13, 0x0000000000000000ULL, 0x000009184e72a000ULL, 13}
, // 43-bit n < 10^13
{0, 0x0000000000000000ULL, 0x000009184e72a000ULL, 13}
, // 44-bit n ? 10^13
{14, 0x0000000000000000ULL, 0x00005af3107a4000ULL, 14}
, // 45-bit n < 10^14
{14, 0x0000000000000000ULL, 0x00005af3107a4000ULL, 14}
, // 46-bit n < 10^14
{0, 0x0000000000000000ULL, 0x00005af3107a4000ULL, 14}
, // 47-bit n ? 10^14
{15, 0x0000000000000000ULL, 0x00038d7ea4c68000ULL, 15}
, // 48-bit n < 10^15
{15, 0x0000000000000000ULL, 0x00038d7ea4c68000ULL, 15}
, // 49-bit n < 10^15
{0, 0x0000000000000000ULL, 0x00038d7ea4c68000ULL, 15}
, // 50-bit n ? 10^15
{16, 0x0000000000000000ULL, 0x002386f26fc10000ULL, 16}
, // 51-bit n < 10^16
{16, 0x0000000000000000ULL, 0x002386f26fc10000ULL, 16}
, // 52-bit n < 10^16
{16, 0x0000000000000000ULL, 0x002386f26fc10000ULL, 16}
, // 53-bit n < 10^16
{0, 0x0000000000000000ULL, 0x002386f26fc10000ULL, 16}
, // 54-bit n ? 10^16
{17, 0x0000000000000000ULL, 0x016345785d8a0000ULL, 17}
, // 55-bit n < 10^17
{17, 0x0000000000000000ULL, 0x016345785d8a0000ULL, 17}
, // 56-bit n < 10^17
{0, 0x0000000000000000ULL, 0x016345785d8a0000ULL, 17}
, // 57-bit n ? 10^17
{18, 0x0000000000000000ULL, 0x0de0b6b3a7640000ULL, 18}
, // 58-bit n < 10^18
{18, 0x0000000000000000ULL, 0x0de0b6b3a7640000ULL, 18}
, // 59-bit n < 10^18
{0, 0x0000000000000000ULL, 0x0de0b6b3a7640000ULL, 18}
, // 60-bit n ? 10^18
{19, 0x0000000000000000ULL, 0x8ac7230489e80000ULL, 19}
, // 61-bit n < 10^19
{19, 0x0000000000000000ULL, 0x8ac7230489e80000ULL, 19}
, // 62-bit n < 10^19
{19, 0x0000000000000000ULL, 0x8ac7230489e80000ULL, 19}
, // 63-bit n < 10^19
{0, 0x0000000000000000ULL, 0x8ac7230489e80000ULL, 19}
, // 64-bit n ? 10^19
{20, 0x0000000000000005ULL, 0x6bc75e2d63100000ULL, 20}
, // 65-bit n < 10^20
{20, 0x0000000000000005ULL, 0x6bc75e2d63100000ULL, 20}
, // 66-bit n < 10^20
{0, 0x0000000000000005ULL, 0x6bc75e2d63100000ULL, 20}
, // 67-bit n ? 10^20
{21, 0x0000000000000036ULL, 0x35c9adc5dea00000ULL, 21}
, // 68-bit n < 10^21
{21, 0x0000000000000036ULL, 0x35c9adc5dea00000ULL, 21}
, // 69-bit n < 10^21
{0, 0x0000000000000036ULL, 0x35c9adc5dea00000ULL, 21}
, // 70-bit n ? 10^21
{22, 0x000000000000021eULL, 0x19e0c9bab2400000ULL, 22}
, // 71-bit n < 10^22
{22, 0x000000000000021eULL, 0x19e0c9bab2400000ULL, 22}
, // 72-bit n < 10^22
{22, 0x000000000000021eULL, 0x19e0c9bab2400000ULL, 22}
, // 73-bit n < 10^22
{0, 0x000000000000021eULL, 0x19e0c9bab2400000ULL, 22}
, // 74-bit n ? 10^22
{23, 0x000000000000152dULL, 0x02c7e14af6800000ULL, 23}
, // 75-bit n < 10^23
{23, 0x000000000000152dULL, 0x02c7e14af6800000ULL, 23}
, // 76-bit n < 10^23
{0, 0x000000000000152dULL, 0x02c7e14af6800000ULL, 23}
, // 77-bit n ? 10^23
{24, 0x000000000000d3c2ULL, 0x1bcecceda1000000ULL, 24}
, // 78-bit n < 10^24
{24, 0x000000000000d3c2ULL, 0x1bcecceda1000000ULL, 24}
, // 79-bit n < 10^24
{0, 0x000000000000d3c2ULL, 0x1bcecceda1000000ULL, 24}
, // 80-bit n ? 10^24
{25, 0x0000000000084595ULL, 0x161401484a000000ULL, 25}
, // 81-bit n < 10^25
{25, 0x0000000000084595ULL, 0x161401484a000000ULL, 25}
, // 82-bit n < 10^25
{25, 0x0000000000084595ULL, 0x161401484a000000ULL, 25}
, // 83-bit n < 10^25
{0, 0x0000000000084595ULL, 0x161401484a000000ULL, 25}
, // 84-bit n ? 10^25
{26, 0x000000000052b7d2ULL, 0xdcc80cd2e4000000ULL, 26}
, // 85-bit n < 10^26
{26, 0x000000000052b7d2ULL, 0xdcc80cd2e4000000ULL, 26}
, // 86-bit n < 10^26
{0, 0x000000000052b7d2ULL, 0xdcc80cd2e4000000ULL, 26}
, // 87-bit n ? 10^26
{27, 0x00000000033b2e3cULL, 0x9fd0803ce8000000ULL, 27}
, // 88-bit n < 10^27
{27, 0x00000000033b2e3cULL, 0x9fd0803ce8000000ULL, 27}
, // 89-bit n < 10^27
{0, 0x00000000033b2e3cULL, 0x9fd0803ce8000000ULL, 27}
, // 90-bit n ? 10^27
{28, 0x00000000204fce5eULL, 0x3e25026110000000ULL, 28}
, // 91-bit n < 10^28
{28, 0x00000000204fce5eULL, 0x3e25026110000000ULL, 28}
, // 92-bit n < 10^28
{28, 0x00000000204fce5eULL, 0x3e25026110000000ULL, 28}
, // 93-bit n < 10^28
{0, 0x00000000204fce5eULL, 0x3e25026110000000ULL, 28}
, // 94-bit n ? 10^28
{29, 0x00000001431e0faeULL, 0x6d7217caa0000000ULL, 29}
, // 95-bit n < 10^29
{29, 0x00000001431e0faeULL, 0x6d7217caa0000000ULL, 29}
, // 96-bit n < 10^29
{0, 0x00000001431e0faeULL, 0x6d7217caa0000000ULL, 29}
, // 97-bit n ? 10^29
{30, 0x0000000c9f2c9cd0ULL, 0x4674edea40000000ULL, 30}
, // 98-bit n < 10^30
{30, 0x0000000c9f2c9cd0ULL, 0x4674edea40000000ULL, 30}
, // 99-bit n < 10^30
{0, 0x0000000c9f2c9cd0ULL, 0x4674edea40000000ULL, 30}
, // 100-bit n ? 10^30
{31, 0x0000007e37be2022ULL, 0xc0914b2680000000ULL, 31}
, // 101-bit n < 10^31
{31, 0x0000007e37be2022ULL, 0xc0914b2680000000ULL, 31}
, // 102-bit n < 10^31
{0, 0x0000007e37be2022ULL, 0xc0914b2680000000ULL, 31}
, // 103-bit n ? 10^31
{32, 0x000004ee2d6d415bULL, 0x85acef8100000000ULL, 32}
, // 104-bit n < 10^32
{32, 0x000004ee2d6d415bULL, 0x85acef8100000000ULL, 32}
, // 105-bit n < 10^32
{32, 0x000004ee2d6d415bULL, 0x85acef8100000000ULL, 32}
, // 106-bit n < 10^32
{0, 0x000004ee2d6d415bULL, 0x85acef8100000000ULL, 32}
, // 107-bit n ? 10^32
{33, 0x0000314dc6448d93ULL, 0x38c15b0a00000000ULL, 33}
, // 108-bit n < 10^33
{33, 0x0000314dc6448d93ULL, 0x38c15b0a00000000ULL, 33}
, // 109-bit n < 10^33
{0, 0x0000314dc6448d93ULL, 0x38c15b0a00000000ULL, 33}
, // 100-bit n ? 10^33
{34, 0x0001ed09bead87c0ULL, 0x378d8e6400000000ULL, 34}
, // 111-bit n < 10^34
{34, 0x0001ed09bead87c0ULL, 0x378d8e6400000000ULL, 34}
, // 112-bit n < 10^34
{0, 0x0001ed09bead87c0ULL, 0x378d8e6400000000ULL, 34} // 113-bit n ? 10^34
//{ 35, 0x0013426172c74d82ULL, 0x2b878fe800000000ULL, 35 } // 114-bit n < 10^35
};
// midpoint64[i - 1] = 1/2 * 10^i = 5 * 10^(i-1), 1 <= i <= 19
UINT64 midpoint64[] = {
0x0000000000000005ULL, // 1/2 * 10^1 = 5 * 10^0
0x0000000000000032ULL, // 1/2 * 10^2 = 5 * 10^1
0x00000000000001f4ULL, // 1/2 * 10^3 = 5 * 10^2
0x0000000000001388ULL, // 1/2 * 10^4 = 5 * 10^3
0x000000000000c350ULL, // 1/2 * 10^5 = 5 * 10^4
0x000000000007a120ULL, // 1/2 * 10^6 = 5 * 10^5
0x00000000004c4b40ULL, // 1/2 * 10^7 = 5 * 10^6
0x0000000002faf080ULL, // 1/2 * 10^8 = 5 * 10^7
0x000000001dcd6500ULL, // 1/2 * 10^9 = 5 * 10^8
0x000000012a05f200ULL, // 1/2 * 10^10 = 5 * 10^9
0x0000000ba43b7400ULL, // 1/2 * 10^11 = 5 * 10^10
0x000000746a528800ULL, // 1/2 * 10^12 = 5 * 10^11
0x0000048c27395000ULL, // 1/2 * 10^13 = 5 * 10^12
0x00002d79883d2000ULL, // 1/2 * 10^14 = 5 * 10^13
0x0001c6bf52634000ULL, // 1/2 * 10^15 = 5 * 10^14
0x0011c37937e08000ULL, // 1/2 * 10^16 = 5 * 10^15
0x00b1a2bc2ec50000ULL, // 1/2 * 10^17 = 5 * 10^16
0x06f05b59d3b20000ULL, // 1/2 * 10^18 = 5 * 10^17
0x4563918244f40000ULL // 1/2 * 10^19 = 5 * 10^18
};
// midpoint128[i - 20] = 1/2 * 10^i = 5 * 10^(i-1), 20 <= i <= 38
UINT128 midpoint128[] = { // the 64-bit word order is L, H
{{0xb5e3af16b1880000ULL, 0x0000000000000002ULL}
}
, // 1/2 * 10^20 = 5 * 10^19
{{0x1ae4d6e2ef500000ULL, 0x000000000000001bULL}
}
, // 1/2 * 10^21 = 5 * 10^20
{{0x0cf064dd59200000ULL, 0x000000000000010fULL}
}
, // 1/2 * 10^22 = 5 * 10^21
{{0x8163f0a57b400000ULL, 0x0000000000000a96ULL}
}
, // 1/2 * 10^23 = 5 * 10^22
{{0x0de76676d0800000ULL, 0x00000000000069e1ULL}
}
, // 1/2 * 10^24 = 5 * 10^23
{{0x8b0a00a425000000ULL, 0x00000000000422caULL}
}
, // 1/2 * 10^25 = 5 * 10^24
{{0x6e64066972000000ULL, 0x0000000000295be9ULL}
}
, // 1/2 * 10^26 = 5 * 10^25
{{0x4fe8401e74000000ULL, 0x00000000019d971eULL}
}
, // 1/2 * 10^27 = 5 * 10^26
{{0x1f12813088000000ULL, 0x000000001027e72fULL}
}
, // 1/2 * 10^28 = 5 * 10^27
{{0x36b90be550000000ULL, 0x00000000a18f07d7ULL}
}
, // 1/2 * 10^29 = 5 * 10^28
{{0x233a76f520000000ULL, 0x000000064f964e68ULL}
}
, // 1/2 * 10^30 = 5 * 10^29
{{0x6048a59340000000ULL, 0x0000003f1bdf1011ULL}
}
, // 1/2 * 10^31 = 5 * 10^30
{{0xc2d677c080000000ULL, 0x0000027716b6a0adULL}
}
, // 1/2 * 10^32 = 5 * 10^31
{{0x9c60ad8500000000ULL, 0x000018a6e32246c9ULL}
}
, // 1/2 * 10^33 = 5 * 10^32
{{0x1bc6c73200000000ULL, 0x0000f684df56c3e0ULL}
}
, // 1/2 * 10^34 = 5 * 10^33
{{0x15c3c7f400000000ULL, 0x0009a130b963a6c1ULL}
}
, // 1/2 * 10^35 = 5 * 10^34
{{0xd9a5cf8800000000ULL, 0x00604be73de4838aULL}
}
, // 1/2 * 10^36 = 5 * 10^35
{{0x807a1b5000000000ULL, 0x03c2f7086aed236cULL}
}
, // 1/2 * 10^37 = 5 * 10^36
{{0x04c5112000000000ULL, 0x259da6542d43623dULL}
} // 1/2 * 10^38 = 5 * 10^37
};
// midpoint192[i - 39] = 1/2 * 10^i = 5 * 10^(i-1), 39 <= i <= 58
UINT192 midpoint192[] = { // the 64-bit word order is L, M, H
{{0x2fb2ab4000000000ULL, 0x78287f49c4a1d662ULL, 0x0000000000000001ULL}
}
,
// 1/2 * 10^39 = 5 * 10^38
{{0xdcfab08000000000ULL, 0xb194f8e1ae525fd5ULL, 0x000000000000000eULL}
}
,
// 1/2 * 10^40 = 5 * 10^39
{{0xa1cae50000000000ULL, 0xefd1b8d0cf37be5aULL, 0x0000000000000092ULL}
}
,
// 1/2 * 10^41 = 5 * 10^40
{{0x51ecf20000000000ULL, 0x5e313828182d6f8aULL, 0x00000000000005bdULL}
}
,
// 1/2 * 10^42 = 5 * 10^41
{{0x3341740000000000ULL, 0xadec3190f1c65b67ULL, 0x0000000000003965ULL}
}
,
// 1/2 * 10^43 = 5 * 10^42
{{0x008e880000000000ULL, 0xcb39efa971bf9208ULL, 0x0000000000023df8ULL}
}
,
// 1/2 * 10^44 = 5 * 10^43
{{0x0591500000000000ULL, 0xf0435c9e717bb450ULL, 0x0000000000166bb7ULL}
}
,
// 1/2 * 10^45 = 5 * 10^44
{{0x37ad200000000000ULL, 0x62a19e306ed50b20ULL, 0x0000000000e0352fULL}
}
,
// 1/2 * 10^46 = 5 * 10^45
{{0x2cc3400000000000ULL, 0xda502de454526f42ULL, 0x0000000008c213d9ULL}
}
,
// 1/2 * 10^47 = 5 * 10^46
{{0xbfa0800000000000ULL, 0x8721caeb4b385895ULL, 0x000000005794c682ULL}
}
,
// 1/2 * 10^48 = 5 * 10^47
{{0x7c45000000000000ULL, 0x4751ed30f03375d9ULL, 0x000000036bcfc119ULL}
}
,
// 1/2 * 10^49 = 5 * 10^48
{{0xdab2000000000000ULL, 0xc93343e962029a7eULL, 0x00000022361d8afcULL}
}
,
// 1/2 * 10^50 = 5 * 10^49
{{0x8af4000000000000ULL, 0xdc00a71dd41a08f4ULL, 0x000001561d276ddfULL}
}
,
// 1/2 * 10^51 = 5 * 10^50
{{0x6d88000000000000ULL, 0x9806872a4904598dULL, 0x00000d5d238a4abeULL}
}
,
// 1/2 * 10^52 = 5 * 10^51
{{0x4750000000000000ULL, 0xf04147a6da2b7f86ULL, 0x000085a36366eb71ULL}
}
,
// 1/2 * 10^53 = 5 * 10^52
{{0xc920000000000000ULL, 0x628ccc8485b2fb3eULL, 0x00053861e2053273ULL}
}
,
// 1/2 * 10^54 = 5 * 10^53
{{0xdb40000000000000ULL, 0xd97ffd2d38fdd073ULL, 0x003433d2d433f881ULL}
}
,
// 1/2 * 10^55 = 5 * 10^54
{{0x9080000000000000ULL, 0x7effe3c439ea2486ULL, 0x020a063c4a07b512ULL}
}
,
// 1/2 * 10^56 = 5 * 10^55
{{0xa500000000000000ULL, 0xf5fee5aa43256d41ULL, 0x14643e5ae44d12b8ULL}
}
,
// 1/2 * 10^57 = 5 * 10^56
{{0x7200000000000000ULL, 0x9bf4f8a69f764490ULL, 0xcbea6f8ceb02bb39ULL}
}
// 1/2 * 10^58 = 5 * 10^57
};
// midpoint256[i - 59] = 1/2 * 10^i = 5 * 10^(i-1), 59 <= i <= 68
UINT256 midpoint256[] = { // the 64-bit word order is LL, LH, HL, HH
{{0x7400000000000000ULL, 0x1791b6823a9eada4ULL,
0xf7285b812e1b5040ULL, 0x0000000000000007ULL}
}
, // 1/2 * 10^59 = 5 * 10^58
{{0x8800000000000000ULL, 0xebb121164a32c86cULL,
0xa793930bcd112280ULL, 0x000000000000004fULL}
}
, // 1/2 * 10^60 = 5 * 10^59
{{0x5000000000000000ULL, 0x34eb4adee5fbd43dULL,
0x8bc3be7602ab5909ULL, 0x000000000000031cULL}
}
, // 1/2 * 10^61 = 5 * 10^60
{{0x2000000000000000ULL, 0x1130ecb4fbd64a65ULL,
0x75a5709c1ab17a5cULL, 0x0000000000001f1dULL}
}
, // 1/2 * 10^62 = 5 * 10^61
{{0x4000000000000000ULL, 0xabe93f11d65ee7f3ULL,
0x987666190aeec798ULL, 0x0000000000013726ULL}
}
, // 1/2 * 10^63 = 5 * 10^62
{{0x8000000000000000ULL, 0xb71c76b25fb50f80ULL,
0xf49ffcfa6d53cbf6ULL, 0x00000000000c2781ULL}
}
, // 1/2 * 10^64 = 5 * 10^63
{{0x0000000000000000ULL, 0x271ca2f7bd129b05ULL,
0x8e3fe1c84545f7a3ULL, 0x0000000000798b13ULL}
}
, // 1/2 * 10^65 = 5 * 10^64
{{0x0000000000000000ULL, 0x871e5dad62ba0e32ULL,
0x8e7ed1d2b4bbac5fULL, 0x0000000004bf6ec3ULL}
}
, // 1/2 * 10^66 = 5 * 10^65
{{0x0000000000000000ULL, 0x472fa8c5db448df4ULL,
0x90f4323b0f54bbbbULL, 0x000000002f7a53a3ULL}
}
, // 1/2 * 10^67 = 5 * 10^66
{{0x0000000000000000ULL, 0xc7dc97ba90ad8b88ULL,
0xa989f64e994f5550ULL, 0x00000001dac74463ULL}
}
, // 1/2 * 10^68 = 5 * 10^67
{{0x0000000000000000ULL, 0xce9ded49a6c77350ULL,
0x9f639f11fd195527ULL, 0x000000128bc8abe4ULL}
}
, // 1/2 * 10^69 = 5 * 10^68
{{0x0000000000000000ULL, 0x122b44e083ca8120ULL,
0x39e436b3e2fd538eULL, 0x000000b975d6b6eeULL}
}
, // 1/2 * 10^70 = 5 * 10^69
{{0x0000000000000000ULL, 0xb5b0b0c525e90b40ULL,
0x42ea2306dde5438cULL, 0x0000073e9a63254eULL}
}
, // 1/2 * 10^71 = 5 * 10^70
{{0x0000000000000000ULL, 0x18e6e7b37b1a7080ULL,
0x9d255e44aaf4a37fULL, 0x0000487207df750eULL}
}
, // 1/2 * 10^72 = 5 * 10^71
{{0x0000000000000000ULL, 0xf9050d02cf086500ULL,
0x2375aeaead8e62f6ULL, 0x0002d4744eba9292ULL}
}
, // 1/2 * 10^73 = 5 * 10^72
{{0x0000000000000000ULL, 0xba32821c1653f200ULL,
0x6298d2d2c78fdda5ULL, 0x001c4c8b1349b9b5ULL}
}
, // 1/2 * 10^74 = 5 * 10^73
{{0x0000000000000000ULL, 0x45f91518df477400ULL,
0xd9f83c3bcb9ea879ULL, 0x011afd6ec0e14115ULL}
}
, // 1/2 * 10^75 = 5 * 10^74
{{0x0000000000000000ULL, 0xbbbad2f8b8ca8800ULL,
0x83b25a55f43294bcULL, 0x0b0de65388cc8adaULL}
}
, // 1/2 * 10^76 = 5 * 10^75
{{0x0000000000000000ULL, 0x554c3db737e95000ULL,
0x24f7875b89f9cf5fULL, 0x6e8aff4357fd6c89ULL}
} // 1/2 * 10^77 = 5 * 10^76
};
// ten2k64[i] = 10^i, 0 <= i <= 19
UINT64 ten2k64[] = {
0x0000000000000001ULL, // 10^0
0x000000000000000aULL, // 10^1
0x0000000000000064ULL, // 10^2
0x00000000000003e8ULL, // 10^3
0x0000000000002710ULL, // 10^4
0x00000000000186a0ULL, // 10^5
0x00000000000f4240ULL, // 10^6
0x0000000000989680ULL, // 10^7
0x0000000005f5e100ULL, // 10^8
0x000000003b9aca00ULL, // 10^9
0x00000002540be400ULL, // 10^10
0x000000174876e800ULL, // 10^11
0x000000e8d4a51000ULL, // 10^12
0x000009184e72a000ULL, // 10^13
0x00005af3107a4000ULL, // 10^14
0x00038d7ea4c68000ULL, // 10^15
0x002386f26fc10000ULL, // 10^16
0x016345785d8a0000ULL, // 10^17
0x0de0b6b3a7640000ULL, // 10^18
0x8ac7230489e80000ULL // 10^19 (20 digits)
};
// ten2k128[i - 20] = 10^i, 20 <= i <= 38
UINT128 ten2k128[] = { // the 64-bit word order is L, H
{{0x6bc75e2d63100000ULL, 0x0000000000000005ULL}
}
, // 10^20
{{0x35c9adc5dea00000ULL, 0x0000000000000036ULL}
}
, // 10^21
{{0x19e0c9bab2400000ULL, 0x000000000000021eULL}
}
, // 10^22
{{0x02c7e14af6800000ULL, 0x000000000000152dULL}
}
, // 10^23
{{0x1bcecceda1000000ULL, 0x000000000000d3c2ULL}
}
, // 10^24
{{0x161401484a000000ULL, 0x0000000000084595ULL}
}
, // 10^25
{{0xdcc80cd2e4000000ULL, 0x000000000052b7d2ULL}
}
, // 10^26
{{0x9fd0803ce8000000ULL, 0x00000000033b2e3cULL}
}
, // 10^27
{{0x3e25026110000000ULL, 0x00000000204fce5eULL}
}
, // 10^28
{{0x6d7217caa0000000ULL, 0x00000001431e0faeULL}
}
, // 10^29
{{0x4674edea40000000ULL, 0x0000000c9f2c9cd0ULL}
}
, // 10^30
{{0xc0914b2680000000ULL, 0x0000007e37be2022ULL}
}
, // 10^31
{{0x85acef8100000000ULL, 0x000004ee2d6d415bULL}
}
, // 10^32
{{0x38c15b0a00000000ULL, 0x0000314dc6448d93ULL}
}
, // 10^33
{{0x378d8e6400000000ULL, 0x0001ed09bead87c0ULL}
}
, // 10^34
{{0x2b878fe800000000ULL, 0x0013426172c74d82ULL}
}
, // 10^35
{{0xb34b9f1000000000ULL, 0x00c097ce7bc90715ULL}
}
, // 10^36
{{0x00f436a000000000ULL, 0x0785ee10d5da46d9ULL}
}
, // 10^37
{{0x098a224000000000ULL, 0x4b3b4ca85a86c47aULL}
} // 10^38 (39 digits)
};
// might split into ten2k192[] and ten2k256[]
// ten2k256[i - 39] = 10^i, 39 <= i <= 68
UINT256 ten2k256[] = { // the 64-bit word order is LL, LH, HL, HH
{{0x5f65568000000000ULL, 0xf050fe938943acc4ULL,
0x0000000000000002ULL, 0x0000000000000000ULL}
}
, // 10^39
{{0xb9f5610000000000ULL, 0x6329f1c35ca4bfabULL,
0x000000000000001dULL, 0x0000000000000000ULL}
}
, // 10^40
{{0x4395ca0000000000ULL, 0xdfa371a19e6f7cb5ULL,
0x0000000000000125ULL, 0x0000000000000000ULL}
}
, // 10^41
{{0xa3d9e40000000000ULL, 0xbc627050305adf14ULL,
0x0000000000000b7aULL, 0x0000000000000000ULL}
}
, // 10^42
{{0x6682e80000000000ULL, 0x5bd86321e38cb6ceULL,
0x00000000000072cbULL, 0x0000000000000000ULL}
}
, // 10^43
{{0x011d100000000000ULL, 0x9673df52e37f2410ULL,
0x0000000000047bf1ULL, 0x0000000000000000ULL}
}
, // 10^44
{{0x0b22a00000000000ULL, 0xe086b93ce2f768a0ULL,
0x00000000002cd76fULL, 0x0000000000000000ULL}
}
, // 10^45
{{0x6f5a400000000000ULL, 0xc5433c60ddaa1640ULL,
0x0000000001c06a5eULL, 0x0000000000000000ULL}
}
, // 10^46
{{0x5986800000000000ULL, 0xb4a05bc8a8a4de84ULL,
0x00000000118427b3ULL, 0x0000000000000000ULL}
}
, // 10^47
{{0x7f41000000000000ULL, 0x0e4395d69670b12bULL,
0x00000000af298d05ULL, 0x0000000000000000ULL}
}
, // 10^48
{{0xf88a000000000000ULL, 0x8ea3da61e066ebb2ULL,
0x00000006d79f8232ULL, 0x0000000000000000ULL}
}
, // 10^49
{{0xb564000000000000ULL, 0x926687d2c40534fdULL,
0x000000446c3b15f9ULL, 0x0000000000000000ULL}
}
, // 10^50
{{0x15e8000000000000ULL, 0xb8014e3ba83411e9ULL,
0x000002ac3a4edbbfULL, 0x0000000000000000ULL}
}
, // 10^51
{{0xdb10000000000000ULL, 0x300d0e549208b31aULL,
0x00001aba4714957dULL, 0x0000000000000000ULL}
}
, // 10^52
{{0x8ea0000000000000ULL, 0xe0828f4db456ff0cULL,
0x00010b46c6cdd6e3ULL, 0x0000000000000000ULL}
}
, // 10^53
{{0x9240000000000000ULL, 0xc51999090b65f67dULL,
0x000a70c3c40a64e6ULL, 0x0000000000000000ULL}
}
, // 10^54
{{0xb680000000000000ULL, 0xb2fffa5a71fba0e7ULL,
0x006867a5a867f103ULL, 0x0000000000000000ULL}
}
, // 10^55
{{0x2100000000000000ULL, 0xfdffc78873d4490dULL,
0x04140c78940f6a24ULL, 0x0000000000000000ULL}
}
, // 10^56
{{0x4a00000000000000ULL, 0xebfdcb54864ada83ULL,
0x28c87cb5c89a2571ULL, 0x0000000000000000ULL}
}
, // 10^57 (58 digits)
{{0xe400000000000000ULL, 0x37e9f14d3eec8920ULL,
0x97d4df19d6057673ULL, 0x0000000000000001ULL}
}
, // 10^58
{{0xe800000000000000ULL, 0x2f236d04753d5b48ULL,
0xee50b7025c36a080ULL, 0x000000000000000fULL}
}
, // 10^59
{{0x1000000000000000ULL, 0xd762422c946590d9ULL,
0x4f2726179a224501ULL, 0x000000000000009fULL}
}
, // 10^60
{{0xa000000000000000ULL, 0x69d695bdcbf7a87aULL,
0x17877cec0556b212ULL, 0x0000000000000639ULL}
}
, // 10^61
{{0x4000000000000000ULL, 0x2261d969f7ac94caULL,
0xeb4ae1383562f4b8ULL, 0x0000000000003e3aULL}
}
, // 10^62
{{0x8000000000000000ULL, 0x57d27e23acbdcfe6ULL,
0x30eccc3215dd8f31ULL, 0x0000000000026e4dULL}
}
, // 10^63
{{0x0000000000000000ULL, 0x6e38ed64bf6a1f01ULL,
0xe93ff9f4daa797edULL, 0x0000000000184f03ULL}
}
, // 10^64
{{0x0000000000000000ULL, 0x4e3945ef7a25360aULL,
0x1c7fc3908a8bef46ULL, 0x0000000000f31627ULL}
}
, // 10^65
{{0x0000000000000000ULL, 0x0e3cbb5ac5741c64ULL,
0x1cfda3a5697758bfULL, 0x00000000097edd87ULL}
}
, // 10^66
{{0x0000000000000000ULL, 0x8e5f518bb6891be8ULL,
0x21e864761ea97776ULL, 0x000000005ef4a747ULL}
}
, // 10^67
{{0x0000000000000000ULL, 0x8fb92f75215b1710ULL,
0x5313ec9d329eaaa1ULL, 0x00000003b58e88c7ULL}
}
, // 10^68
{{0x0000000000000000ULL, 0x9d3bda934d8ee6a0ULL,
0x3ec73e23fa32aa4fULL, 0x00000025179157c9ULL}
}
, // 10^69
{{0x0000000000000000ULL, 0x245689c107950240ULL,
0x73c86d67c5faa71cULL, 0x00000172ebad6ddcULL}
}
, // 10^70
{{0x0000000000000000ULL, 0x6b61618a4bd21680ULL,
0x85d4460dbbca8719ULL, 0x00000e7d34c64a9cULL}
}
, // 10^71
{{0x0000000000000000ULL, 0x31cdcf66f634e100ULL,
0x3a4abc8955e946feULL, 0x000090e40fbeea1dULL}
}
, // 10^72
{{0x0000000000000000ULL, 0xf20a1a059e10ca00ULL,
0x46eb5d5d5b1cc5edULL, 0x0005a8e89d752524ULL}
}
, // 10^73
{{0x0000000000000000ULL, 0x746504382ca7e400ULL,
0xc531a5a58f1fbb4bULL, 0x003899162693736aULL}
}
, // 10^74
{{0x0000000000000000ULL, 0x8bf22a31be8ee800ULL,
0xb3f07877973d50f2ULL, 0x0235fadd81c2822bULL}
}
, // 10^75
{{0x0000000000000000ULL, 0x7775a5f171951000ULL,
0x0764b4abe8652979ULL, 0x161bcca7119915b5ULL}
}
, // 10^76
{{0x0000000000000000ULL, 0xaa987b6e6fd2a000ULL,
0x49ef0eb713f39ebeULL, 0xdd15fe86affad912ULL}
} // 10^77
};
// ten2mk128[k - 1] = 10^(-k) * 2^exp (k), where 1 <= k <= 34 and
// exp (k) = shiftright128[k - 1] + 128
UINT128 ten2mk128[] = {
{{0x999999999999999aULL, 0x1999999999999999ULL}
}
, // 10^(-1) * 2^128
{{0x28f5c28f5c28f5c3ULL, 0x028f5c28f5c28f5cULL}
}
, // 10^(-2) * 2^128
{{0x9db22d0e56041894ULL, 0x004189374bc6a7efULL}
}
, // 10^(-3) * 2^128
{{0x4af4f0d844d013aaULL, 0x00346dc5d6388659ULL}
}
, // 10^(-4) * 2^131
{{0x08c3f3e0370cdc88ULL, 0x0029f16b11c6d1e1ULL}
}
, // 10^(-5) * 2^134
{{0x6d698fe69270b06dULL, 0x00218def416bdb1aULL}
}
, // 10^(-6) * 2^137
{{0xaf0f4ca41d811a47ULL, 0x0035afe535795e90ULL}
}
, // 10^(-7) * 2^141
{{0xbf3f70834acdaea0ULL, 0x002af31dc4611873ULL}
}
, // 10^(-8) * 2^144
{{0x65cc5a02a23e254dULL, 0x00225c17d04dad29ULL}
}
, // 10^(-9) * 2^147
{{0x6fad5cd10396a214ULL, 0x0036f9bfb3af7b75ULL}
}
, // 10^(-10) * 2^151
{{0xbfbde3da69454e76ULL, 0x002bfaffc2f2c92aULL}
}
, // 10^(-11) * 2^154
{{0x32fe4fe1edd10b92ULL, 0x00232f33025bd422ULL}
}
, // 10^(-12) * 2^157
{{0x84ca19697c81ac1cULL, 0x00384b84d092ed03ULL}
}
, // 10^(-13) * 2^161
{{0x03d4e1213067bce4ULL, 0x002d09370d425736ULL}
}
, // 10^(-14) * 2^164
{{0x3643e74dc052fd83ULL, 0x0024075f3dceac2bULL}
}
, // 10^(-15) * 2^167
{{0x56d30baf9a1e626bULL, 0x0039a5652fb11378ULL}
}
, // 10^(-16) * 2^171
{{0x12426fbfae7eb522ULL, 0x002e1dea8c8da92dULL}
}
, // 10^(-17) * 2^174
{{0x41cebfcc8b9890e8ULL, 0x0024e4bba3a48757ULL}
}
, // 10^(-18) * 2^177
{{0x694acc7a78f41b0dULL, 0x003b07929f6da558ULL}
}
, // 10^(-19) * 2^181
{{0xbaa23d2ec729af3eULL, 0x002f394219248446ULL}
}
, // 10^(-20) * 2^184
{{0xfbb4fdbf05baf298ULL, 0x0025c768141d369eULL}
}
, // 10^(-21) * 2^187
{{0x2c54c931a2c4b759ULL, 0x003c7240202ebdcbULL}
}
, // 10^(-22) * 2^191
{{0x89dd6dc14f03c5e1ULL, 0x00305b66802564a2ULL}
}
, // 10^(-23) * 2^194
{{0xd4b1249aa59c9e4eULL, 0x0026af8533511d4eULL}
}
, // 10^(-24) * 2^197
{{0x544ea0f76f60fd49ULL, 0x003de5a1ebb4fbb1ULL}
}
, // 10^(-25) * 2^201
{{0x76a54d92bf80caa1ULL, 0x00318481895d9627ULL}
}
, // 10^(-26) * 2^204
{{0x921dd7a89933d54eULL, 0x00279d346de4781fULL}
}
, // 10^(-27) * 2^207
{{0x8362f2a75b862215ULL, 0x003f61ed7ca0c032ULL}
}
, // 10^(-28) * 2^211
{{0xcf825bb91604e811ULL, 0x0032b4bdfd4d668eULL}
}
, // 10^(-29) * 2^214
{{0x0c684960de6a5341ULL, 0x00289097fdd7853fULL}
}
, // 10^(-30) * 2^217
{{0x3d203ab3e521dc34ULL, 0x002073accb12d0ffULL}
}
, // 10^(-31) * 2^220
{{0x2e99f7863b696053ULL, 0x0033ec47ab514e65ULL}
}
, // 10^(-32) * 2^224
{{0x587b2c6b62bab376ULL, 0x002989d2ef743eb7ULL}
}
, // 10^(-33) * 2^227
{{0xad2f56bc4efbc2c5ULL, 0x00213b0f25f69892ULL}
}
, // 10^(-34) * 2^230
};
// shiftright128[] contains the right shift count to obtain C2* from the top
// 128 bits of the 128x128-bit product C2 * Kx
int shiftright128[] = {
0, // 128 - 128
0, // 128 - 128
0, // 128 - 128
3, // 131 - 128
6, // 134 - 128
9, // 137 - 128
13, // 141 - 128
16, // 144 - 128
19, // 147 - 128
23, // 151 - 128
26, // 154 - 128
29, // 157 - 128
33, // 161 - 128
36, // 164 - 128
39, // 167 - 128
43, // 171 - 128
46, // 174 - 128
49, // 177 - 128
53, // 181 - 128
56, // 184 - 128
59, // 187 - 128
63, // 191 - 128
66, // 194 - 128
69, // 197 - 128
73, // 201 - 128
76, // 204 - 128
79, // 207 - 128
83, // 211 - 128
86, // 214 - 128
89, // 217 - 128
92, // 220 - 128
96, // 224 - 128
99, // 227 - 128
102 // 230 - 128
};
// maskhigh128[] contains the mask to apply to the top 128 bits of the
// 128x128-bit product in order to obtain the high bits of f2*
// the 64-bit word order is L, H
UINT64 maskhigh128[] = {
0x0000000000000000ULL, // 0 = 128 - 128 bits
0x0000000000000000ULL, // 0 = 128 - 128 bits
0x0000000000000000ULL, // 0 = 128 - 128 bits
0x0000000000000007ULL, // 3 = 131 - 128 bits
0x000000000000003fULL, // 6 = 134 - 128 bits
0x00000000000001ffULL, // 9 = 137 - 128 bits
0x0000000000001fffULL, // 13 = 141 - 128 bits
0x000000000000ffffULL, // 16 = 144 - 128 bits
0x000000000007ffffULL, // 19 = 147 - 128 bits
0x00000000007fffffULL, // 23 = 151 - 128 bits
0x0000000003ffffffULL, // 26 = 154 - 128 bits
0x000000001fffffffULL, // 29 = 157 - 128 bits
0x00000001ffffffffULL, // 33 = 161 - 128 bits
0x0000000fffffffffULL, // 36 = 164 - 128 bits
0x0000007fffffffffULL, // 39 = 167 - 128 bits
0x000007ffffffffffULL, // 43 = 171 - 128 bits
0x00003fffffffffffULL, // 46 = 174 - 128 bits
0x0001ffffffffffffULL, // 49 = 177 - 128 bits
0x001fffffffffffffULL, // 53 = 181 - 128 bits
0x00ffffffffffffffULL, // 56 = 184 - 128 bits
0x07ffffffffffffffULL, // 59 = 187 - 128 bits
0x7fffffffffffffffULL, // 63 = 191 - 128 bits
0x0000000000000003ULL, // 2 = 194 - 192 bits
0x000000000000001fULL, // 5 = 197 - 192 bits
0x00000000000001ffULL, // 9 = 201 - 192 bits
0x0000000000000fffULL, // 12 = 204 - 192 bits
0x0000000000007fffULL, // 15 = 207 - 192 bits
0x000000000007ffffULL, // 21 = 211 - 192 bits
0x00000000003fffffULL, // 22 = 214 - 192 bits
0x0000000001ffffffULL, // 25 = 217 - 192 bits
0x000000000fffffffULL, // 28 = 220 - 192 bits
0x00000000ffffffffULL, // 32 = 224 - 192 bits
0x00000007ffffffffULL, // 35 = 227 - 192 bits
0x0000003fffffffffULL // 38 = 230 - 192 bits
};
// onehalf128[] contains the high bits of 1/2 positioned correctly for
// comparison with the high bits of f2*
// the 64-bit word order is L, H
UINT64 onehalf128[] = {
0x0000000000000000ULL, // 0 bits
0x0000000000000000ULL, // 0 bits
0x0000000000000000ULL, // 0 bits
0x0000000000000004ULL, // 3 bits
0x0000000000000020ULL, // 6 bits
0x0000000000000100ULL, // 9 bits
0x0000000000001000ULL, // 13 bits
0x0000000000008000ULL, // 16 bits
0x0000000000040000ULL, // 19 bits
0x0000000000400000ULL, // 23 bits
0x0000000002000000ULL, // 26 bits
0x0000000010000000ULL, // 29 bits
0x0000000100000000ULL, // 33 bits
0x0000000800000000ULL, // 36 bits
0x0000004000000000ULL, // 39 bits
0x0000040000000000ULL, // 43 bits
0x0000200000000000ULL, // 46 bits
0x0001000000000000ULL, // 49 bits
0x0010000000000000ULL, // 53 bits
0x0080000000000000ULL, // 56 bits
0x0400000000000000ULL, // 59 bits
0x4000000000000000ULL, // 63 bits
0x0000000000000002ULL, // 66 bits
0x0000000000000010ULL, // 69 bits
0x0000000000000100ULL, // 73 bits
0x0000000000000800ULL, // 76 bits
0x0000000000004000ULL, // 79 bits
0x0000000000040000ULL, // 83 bits
0x0000000000200000ULL, // 86 bits
0x0000000001000000ULL, // 89 bits
0x0000000008000000ULL, // 92 bits
0x0000000080000000ULL, // 96 bits
0x0000000400000000ULL, // 99 bits
0x0000002000000000ULL // 102 bits
};
UINT64 ten2mk64[] = {
0x199999999999999aULL, // 10^(-1) * 2^ 64
0x028f5c28f5c28f5dULL, // 10^(-2) * 2^ 64
0x004189374bc6a7f0ULL, // 10^(-3) * 2^ 64
0x00346dc5d638865aULL, // 10^(-4) * 2^ 67
0x0029f16b11c6d1e2ULL, // 10^(-5) * 2^ 70
0x00218def416bdb1bULL, // 10^(-6) * 2^ 73
0x0035afe535795e91ULL, // 10^(-7) * 2^ 77
0x002af31dc4611874ULL, // 10^(-8) * 2^ 80
0x00225c17d04dad2aULL, // 10^(-9) * 2^ 83
0x0036f9bfb3af7b76ULL, // 10^(-10) * 2^ 87
0x002bfaffc2f2c92bULL, // 10^(-11) * 2^ 90
0x00232f33025bd423ULL, // 10^(-12) * 2^ 93
0x00384b84d092ed04ULL, // 10^(-13) * 2^ 97
0x002d09370d425737ULL, // 10^(-14) * 2^100
0x0024075f3dceac2cULL, // 10^(-15) * 2^103
0x0039a5652fb11379ULL, // 10^(-16) * 2^107
};
// ten2mk128trunc[] contains T*, the top Ex >= 128 bits of 10^(-k),
// for 1 <= k <= 34
// the 64-bit word order is L, H
UINT128 ten2mk128trunc[] = {
{{0x9999999999999999ULL, 0x1999999999999999ULL}}, // 10^(-1) * 2^128
{{0x28f5c28f5c28f5c2ULL, 0x028f5c28f5c28f5cULL}}, // 10^(-2) * 2^128
{{0x9db22d0e56041893ULL, 0x004189374bc6a7efULL}}, // 10^(-3) * 2^128
{{0x4af4f0d844d013a9ULL, 0x00346dc5d6388659ULL}}, // 10^(-4) * 2^131
{{0x08c3f3e0370cdc87ULL, 0x0029f16b11c6d1e1ULL}}, // 10^(-5) * 2^134
{{0x6d698fe69270b06cULL, 0x00218def416bdb1aULL}}, // 10^(-6) * 2^137
{{0xaf0f4ca41d811a46ULL, 0x0035afe535795e90ULL}}, // 10^(-7) * 2^141
{{0xbf3f70834acdae9fULL, 0x002af31dc4611873ULL}}, // 10^(-8) * 2^144
{{0x65cc5a02a23e254cULL, 0x00225c17d04dad29ULL}}, // 10^(-9) * 2^147
{{0x6fad5cd10396a213ULL, 0x0036f9bfb3af7b75ULL}}, // 10^(-10) * 2^151
{{0xbfbde3da69454e75ULL, 0x002bfaffc2f2c92aULL}}, // 10^(-11) * 2^154
{{0x32fe4fe1edd10b91ULL, 0x00232f33025bd422ULL}}, // 10^(-12) * 2^157
{{0x84ca19697c81ac1bULL, 0x00384b84d092ed03ULL}}, // 10^(-13) * 2^161
{{0x03d4e1213067bce3ULL, 0x002d09370d425736ULL}}, // 10^(-14) * 2^164
{{0x3643e74dc052fd82ULL, 0x0024075f3dceac2bULL}}, // 10^(-15) * 2^167
{{0x56d30baf9a1e626aULL, 0x0039a5652fb11378ULL}}, // 10^(-16) * 2^171
{{0x12426fbfae7eb521ULL, 0x002e1dea8c8da92dULL}}, // 10^(-17) * 2^174
{{0x41cebfcc8b9890e7ULL, 0x0024e4bba3a48757ULL}}, // 10^(-18) * 2^177
{{0x694acc7a78f41b0cULL, 0x003b07929f6da558ULL}}, // 10^(-19) * 2^181
{{0xbaa23d2ec729af3dULL, 0x002f394219248446ULL}}, // 10^(-20) * 2^184
{{0xfbb4fdbf05baf297ULL, 0x0025c768141d369eULL}}, // 10^(-21) * 2^187
{{0x2c54c931a2c4b758ULL, 0x003c7240202ebdcbULL}}, // 10^(-22) * 2^191
{{0x89dd6dc14f03c5e0ULL, 0x00305b66802564a2ULL}}, // 10^(-23) * 2^194
{{0xd4b1249aa59c9e4dULL, 0x0026af8533511d4eULL}}, // 10^(-24) * 2^197
{{0x544ea0f76f60fd48ULL, 0x003de5a1ebb4fbb1ULL}}, // 10^(-25) * 2^201
{{0x76a54d92bf80caa0ULL, 0x00318481895d9627ULL}}, // 10^(-26) * 2^204
{{0x921dd7a89933d54dULL, 0x00279d346de4781fULL}}, // 10^(-27) * 2^207
{{0x8362f2a75b862214ULL, 0x003f61ed7ca0c032ULL}}, // 10^(-28) * 2^211
{{0xcf825bb91604e810ULL, 0x0032b4bdfd4d668eULL}}, // 10^(-29) * 2^214
{{0x0c684960de6a5340ULL, 0x00289097fdd7853fULL}}, // 10^(-30) * 2^217
{{0x3d203ab3e521dc33ULL, 0x002073accb12d0ffULL}}, // 10^(-31) * 2^220
{{0x2e99f7863b696052ULL, 0x0033ec47ab514e65ULL}}, // 10^(-32) * 2^224
{{0x587b2c6b62bab375ULL, 0x002989d2ef743eb7ULL}}, // 10^(-33) * 2^227
{{0xad2f56bc4efbc2c4ULL, 0x00213b0f25f69892ULL}}, // 10^(-34) * 2^230
};
// ten2mk128M[k - 1] = 10^(-k) * 2^exp (k), where 1 <= k <= 4 and
// exp (k) = shiftright128[k - 1] + 128
// the 64-bit word order is L, H
UINT128 ten2mk128M[] = {
{{0xcccccccccccccccdULL, 0xccccccccccccccccULL}}, // 10^(-1) * 2^131
{{0x3d70a3d70a3d70a4ULL, 0xa3d70a3d70a3d70aULL}}, // 10^(-2) * 2^134
{{0x645a1cac083126eaULL, 0x83126e978d4fdf3bULL}}, // 10^(-3) * 2^137
{{0xd3c36113404ea4a9ULL, 0xd1b71758e219652bULL}} // 10^(-4) * 2^141
};
// ten2mk128truncM[] contains T*, the top Ex >= 128 bits of 10^(-k),
// for 1 <= k <= 4; the top bits which are 0 are not represented
// the 64-bit word order is L, H
UINT128 ten2mk128truncM[] = {
{{0xccccccccccccccccULL, 0xccccccccccccccccULL}}, // 10^(-1) * 2^131
{{0x3d70a3d70a3d70a3ULL, 0xa3d70a3d70a3d70aULL}}, // 10^(-2) * 2^134
{{0x645a1cac083126e9ULL, 0x83126e978d4fdf3bULL}}, // 10^(-3) * 2^137
{{0xd3c36113404ea4a8ULL, 0xd1b71758e219652bULL}} // 10^(-4) * 2^141
};
// shiftright128M[] contains the right shift count to obtain C2* from the top
// 128 bits of the 128x128-bit product C2 * Kx
int shiftright128M[] = {
3, // 131 - 128
6, // 134 - 128
9, // 137 - 128
13 // 141 - 128
};
// maskhigh128M[] contains the mask to apply to the top 128 bits of the
// 128x128-bit product in order to obtain the high bits of f*
// the high 64 bits of the mask are 0, so only the low 64 bits are represented
UINT64 maskhigh128M[] = {
0x0000000000000007ULL, // 3 = 131 - 128 bits
0x000000000000003fULL, // 6 = 134 - 128 bits
0x00000000000001ffULL, // 9 = 137 - 128 bits
0x0000000000001fffULL // 13 = 141 - 128 bits
};
// onehalf128M[] contains 1/2 positioned correctly for
// comparison with the high bits of f*
// the high 64 bits are 0, so only the low 64 bits are represented
UINT64 onehalf128M[] = {
0x0000000000000004ULL, // 3 bits
0x0000000000000020ULL, // 6 bits
0x0000000000000100ULL, // 9 bits
0x0000000000001000ULL // 13 bits
};
// ten2mk192M[k - 1] = 10^(-k-4) * 2^exp (k), where 1 <= k <= 19 and
// exp (k) = shiftright128[k - 1] + 128
// the 64-bit word order is L, M, H
UINT192 ten2mk192M[] = {
{{0xcddd6e04c0592104ULL, 0x0fcf80dc33721d53ULL,
0xa7c5ac471b478423ULL}},
// 10^(-5) * 2^208
{{0xd7e45803cd141a6aULL, 0xa63f9a49c2c1b10fULL,
0x8637bd05af6c69b5ULL}},
// 10^(-6) * 2^211
{{0x8ca08cd2e1b9c3dcULL, 0x3d32907604691b4cULL,
0xd6bf94d5e57a42bcULL}},
// 10^(-7) * 2^215
{{0x3d4d3d758161697dULL, 0xfdc20d2b36ba7c3dULL,
0xabcc77118461cefcULL}},
// 10^(-8) * 2^218
{{0xfdd7645e011abacaULL, 0x31680a88f8953030ULL,
0x89705f4136b4a597ULL}},
// 10^(-9) * 2^221
{{0x2fbf06fcce912addULL, 0xb573440e5a884d1bULL,
0xdbe6fecebdedd5beULL}},
// 10^(-10) * 2^225
{{0xf2ff38ca3eda88b1ULL, 0xf78f69a51539d748ULL,
0xafebff0bcb24aafeULL}},
// 10^(-11) * 2^228
{{0xf598fa3b657ba08eULL, 0xf93f87b7442e45d3ULL,
0x8cbccc096f5088cbULL}},
// 10^(-12) * 2^231
{{0x88f4c3923bf900e3ULL, 0x2865a5f206b06fb9ULL,
0xe12e13424bb40e13ULL}},
// 10^(-13) * 2^235
{{0x6d909c74fcc733e9ULL, 0x538484c19ef38c94ULL,
0xb424dc35095cd80fULL}},
// 10^(-14) * 2^238
{{0x57a6e390ca38f654ULL, 0x0f9d37014bf60a10ULL,
0x901d7cf73ab0acd9ULL}},
// 10^(-15) * 2^241
{{0xbf716c1add27f086ULL, 0x4c2ebe687989a9b3ULL,
0xe69594bec44de15bULL}},
// 10^(-16) * 2^245
{{0xff8df0157db98d38ULL, 0x09befeb9fad487c2ULL,
0xb877aa3236a4b449ULL}},
// 10^(-17) * 2^248
{{0x32d7f344649470faULL, 0x3aff322e62439fcfULL,
0x9392ee8e921d5d07ULL}},
// 10^(-18) * 2^251
{{0x1e2652070753e7f5ULL, 0x2b31e9e3d06c32e5ULL,
0xec1e4a7db69561a5ULL}},
// 10^(-19) * 2^255
{{0x181ea8059f76532bULL, 0x88f4bb1ca6bcf584ULL,
0xbce5086492111aeaULL}},
// 10^(-20) * 2^258
{{0x467eecd14c5ea8efULL, 0xd3f6fc16ebca5e03ULL,
0x971da05074da7beeULL}},
// 10^(-21) * 2^261
{{0x70cb148213caa7e5ULL, 0x5324c68b12dd6338ULL,
0xf1c90080baf72cb1ULL}},
// 10^(-22) * 2^265
{{0x8d6f439b43088651ULL, 0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}}
// 10^(-23) * 2^268
};
// ten2mk192truncM[] contains T*, the top Ex >= 192 bits of 10^(-k),
// for 5 <= k <= 23; the top bits which are 0 are not represented
// the 64-bit word order is L, M, H
UINT192 ten2mk192truncM[] = {
{{0xcddd6e04c0592103ULL, 0x0fcf80dc33721d53ULL,
0xa7c5ac471b478423ULL}},
// 10^(-5) * 2^208
{{0xd7e45803cd141a69ULL, 0xa63f9a49c2c1b10fULL,
0x8637bd05af6c69b5ULL}},
// 10^(-6) * 2^211
{{0x8ca08cd2e1b9c3dbULL, 0x3d32907604691b4cULL,
0xd6bf94d5e57a42bcULL}},
// 10^(-7) * 2^215
{{0x3d4d3d758161697cULL, 0xfdc20d2b36ba7c3dULL,
0xabcc77118461cefcULL}},
// 10^(-8) * 2^218
{{0xfdd7645e011abac9ULL, 0x31680a88f8953030ULL,
0x89705f4136b4a597ULL}},
// 10^(-9) * 2^221
{{0x2fbf06fcce912adcULL, 0xb573440e5a884d1bULL,
0xdbe6fecebdedd5beULL}},
// 10^(-10) * 2^225
{{0xf2ff38ca3eda88b0ULL, 0xf78f69a51539d748ULL,
0xafebff0bcb24aafeULL}},
// 10^(-11) * 2^228
{{0xf598fa3b657ba08dULL, 0xf93f87b7442e45d3ULL,
0x8cbccc096f5088cbULL}},
// 10^(-12) * 2^231
{{0x88f4c3923bf900e2ULL, 0x2865a5f206b06fb9ULL,
0xe12e13424bb40e13ULL}},
// 10^(-13) * 2^235
{{0x6d909c74fcc733e8ULL, 0x538484c19ef38c94ULL,
0xb424dc35095cd80fULL}},
// 10^(-14) * 2^238
{{0x57a6e390ca38f653ULL, 0x0f9d37014bf60a10ULL,
0x901d7cf73ab0acd9ULL}},
// 10^(-15) * 2^241
{{0xbf716c1add27f085ULL, 0x4c2ebe687989a9b3ULL,
0xe69594bec44de15bULL}},
// 10^(-16) * 2^245
{{0xff8df0157db98d37ULL, 0x09befeb9fad487c2ULL,
0xb877aa3236a4b449ULL}},
// 10^(-17) * 2^248
{{0x32d7f344649470f9ULL, 0x3aff322e62439fcfULL,
0x9392ee8e921d5d07ULL}},
// 10^(-18) * 2^251
{{0x1e2652070753e7f4ULL, 0x2b31e9e3d06c32e5ULL,
0xec1e4a7db69561a5ULL}},
// 10^(-19) * 2^255
{{0x181ea8059f76532aULL, 0x88f4bb1ca6bcf584ULL,
0xbce5086492111aeaULL}},
// 10^(-20) * 2^258
{{0x467eecd14c5ea8eeULL, 0xd3f6fc16ebca5e03ULL,
0x971da05074da7beeULL}},
// 10^(-21) * 2^261
{{0x70cb148213caa7e4ULL, 0x5324c68b12dd6338ULL,
0xf1c90080baf72cb1ULL}},
// 10^(-22) * 2^265
{{0x8d6f439b43088650ULL, 0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}}
// 10^(-23) * 2^268
};
// shiftright192M[] contains the right shift count to obtain C2* from the top
// 192 bits of the 192x192-bit product C2 * Kx if 0 <= ind <= 14 where ind is
// the index in the table, or from the top 128 bits if 15 <= ind <= 18
int shiftright192M[] = {
16, // 208 - 192
19, // 211 - 192
23, // 215 - 192
26, // 218 - 192
29, // 221 - 192
33, // 225 - 192
36, // 228 - 192
39, // 231 - 192
43, // 235 - 192
46, // 238 - 192
49, // 241 - 192
53, // 245 - 192
56, // 248 - 192
59, // 251 - 192
63, // 255 - 192
2, // 258 - 256
5, // 261 - 256
9, // 265 - 256
12 // 268 - 256
};
// maskhigh192M[] contains the mask to apply to the top 192 bits of the
// 192x192-bit product in order to obtain the high bits of f*
// if 0 <= ind <= 14 where ind is the index in the table, then the high 128 bits
// of the 384-bit mask are 0; if 15 <= ind <= 18 then the high 64 bits are 0
UINT64 maskhigh192M[] = {
0x000000000000ffffULL, // 16 = 208 - 192 bits
0x000000000007ffffULL, // 19 = 211 - 192 bits
0x00000000007fffffULL, // 23 = 215 - 192 bits
0x0000000003ffffffULL, // 26 = 218 - 192 bits
0x000000001fffffffULL, // 29 = 221 - 192 bits
0x00000001ffffffffULL, // 33 = 225 - 192 bits
0x0000000fffffffffULL, // 36 = 228 - 192 bits
0x0000007fffffffffULL, // 39 = 231 - 192 bits
0x000007ffffffffffULL, // 43 = 235 - 192 bits
0x00003fffffffffffULL, // 46 = 238 - 192 bits
0x0001ffffffffffffULL, // 49 = 241 - 192 bits
0x001fffffffffffffULL, // 53 = 245 - 192 bits
0x00ffffffffffffffULL, // 56 = 248 - 192 bits
0x07ffffffffffffffULL, // 59 = 251 - 192 bits
0x7fffffffffffffffULL, // 63 = 255 - 192 bits
0x0000000000000003ULL, // 2 = 258 - 256 bits
0x000000000000001fULL, // 5 = 261 - 256 bits
0x00000000000001ffULL, // 9 = 265 - 256 bits
0x0000000000000fffULL // 12 = 268 - 256 bits
};
// onehalf192M[] contains 1/2 positioned correctly for
// comparison with the high bits of f*
// if 0 <= ind <= 14 where ind is the index in the table, then the high 128 bits
// of the 384-bit mask are 0; if 15 <= ind <= 18 then the high 648 bits are 0
UINT64 onehalf192M[] = {
0x0000000000008000ULL, // 16 = 208 - 192 bits
0x0000000000040000ULL, // 19 = 211 - 192 bits
0x0000000000400000ULL, // 23 = 215 - 192 bits
0x0000000002000000ULL, // 26 = 218 - 192 bits
0x0000000010000000ULL, // 29 = 221 - 192 bits
0x0000000100000000ULL, // 33 = 225 - 192 bits
0x0000000800000000ULL, // 36 = 228 - 192 bits
0x0000004000000000ULL, // 39 = 231 - 192 bits
0x0000040000000000ULL, // 43 = 235 - 192 bits
0x0000200000000000ULL, // 46 = 238 - 192 bits
0x0001000000000000ULL, // 49 = 241 - 192 bits
0x0010000000000000ULL, // 53 = 245 - 192 bits
0x0080000000000000ULL, // 56 = 248 - 192 bits
0x0400000000000000ULL, // 59 = 251 - 192 bits
0x4000000000000000ULL, // 63 = 255 - 192 bits
0x0000000000000002ULL, // 2 = 258 - 256 bits
0x0000000000000010ULL, // 5 = 261 - 256 bits
0x0000000000000100ULL, // 9 = 265 - 256 bits
0x0000000000000800ULL // 12 = 268 - 256 bits
};
// ten2mk256M[k - 1] = 10^(-k-23) * 2^exp (k), where 1 <= k <= 11 and
// exp (k) = shiftright128[k - 1] + 128
UINT256 ten2mk256M[] = { // the 64-bit word order is LL, LH, HL, HH
{{0xf23472530ce6e3edULL, 0xd78c3615cf3a050cULL,
0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}}, // 10^(-24) * 2^335
{{0xe9ed83b814a49fe1ULL, 0x8c1389bc7ec33b47ULL,
0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}}, // 10^(-25) * 2^339
{{0x87f1362cdd507fe7ULL, 0x3cdc6e306568fc39ULL,
0x95364afe032a819dULL, 0xc612062576589ddaULL}}, // 10^(-26) * 2^342
{{0x9ff42b5717739986ULL, 0xca49f1c05120c9c7ULL,
0x775ea264cf55347dULL, 0x9e74d1b791e07e48ULL}}, // 10^(-27) * 2^345
{{0xccb9def1bf1f5c09ULL, 0x76dcb60081ce0fa5ULL,
0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}}, // 10^(-28) * 2^349
{{0xa3c7e58e327f7cd4ULL, 0x5f16f80067d80c84ULL,
0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}}, // 10^(-29) * 2^352
{{0xb6398471c1ff9710ULL, 0x18df2ccd1fe00a03ULL,
0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}}, // 10^(-30) * 2^355
{{0xf82e038e34cc78daULL, 0x4718f0a419800802ULL,
0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}}, // 10^(-31) * 2^358
{{0x59e338e387ad8e29ULL, 0x0b5b1aa028ccd99eULL,
0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}}, // 10^(-32) * 2^362
{{0x47e8fa4f9fbe0b54ULL, 0x6f7c154ced70ae18ULL,
0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}}, // 10^(-33) * 2^365
{{0xd320c83fb2fe6f76ULL, 0xbf967770bdf3be79ULL,
0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}} // 10^(-34) * 2^368
};
// ten2mk256truncM[] contains T*, the top Ex >= 256 bits of 10^(-k),
// for 24 <= k <= 34; the top bits which are 0 are not represented
UINT256 ten2mk256truncM[] = { // the 64-bit word order is LL, LH, HL, HH
{{0xf23472530ce6e3ecULL, 0xd78c3615cf3a050cULL,
0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}}, // 10^(-24) * 2^335
{{0xe9ed83b814a49fe0ULL, 0x8c1389bc7ec33b47ULL,
0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}}, // 10^(-25) * 2^339
{{0x87f1362cdd507fe6ULL, 0x3cdc6e306568fc39ULL,
0x95364afe032a819dULL, 0xc612062576589ddaULL}}, // 10^(-26) * 2^342
{{0x775ea264cf55347cULL, 0x9ff42b5717739986ULL,
0xca49f1c05120c9c7ULL, 0x9e74d1b791e07e48ULL}}, // 10^(-27) * 2^345
{{0xccb9def1bf1f5c08ULL, 0x76dcb60081ce0fa5ULL,
0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}}, // 10^(-28) * 2^349
{{0xa3c7e58e327f7cd3ULL, 0x5f16f80067d80c84ULL,
0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}}, // 10^(-29) * 2^352
{{0xb6398471c1ff970fULL, 0x18df2ccd1fe00a03ULL,
0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}}, // 10^(-30) * 2^355
{{0xf82e038e34cc78d9ULL, 0x4718f0a419800802ULL,
0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}}, // 10^(-31) * 2^358
{{0x59e338e387ad8e28ULL, 0x0b5b1aa028ccd99eULL,
0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}}, // 10^(-32) * 2^362
{{0x47e8fa4f9fbe0b53ULL, 0x6f7c154ced70ae18ULL,
0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}}, // 10^(-33) * 2^365
{{0xd320c83fb2fe6f75ULL, 0xbf967770bdf3be79ULL,
0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}} // 10^(-34) * 2^368
};
// shiftright256M[] contains the right shift count to obtain C2* from the top
// 192 bits of the 256x256-bit product C2 * Kx
int shiftright256M[] = {
15, // 335 - 320
19, // 339 - 320
22, // 342 - 320
25, // 345 - 320
29, // 349 - 320
32, // 352 - 320 // careful of 32-bit machines!
35, // 355 - 320
38, // 358 - 320
42, // 362 - 320
45, // 365 - 320
48 // 368 - 320
};
// maskhigh256M[] contains the mask to apply to the top 192 bits of the
// 256x256-bit product in order to obtain the high bits of f*
UINT64 maskhigh256M[] = {
0x0000000000007fffULL, // 15 = 335 - 320 bits
0x000000000007ffffULL, // 19 = 339 - 320 bits
0x00000000003fffffULL, // 22 = 342 - 320 bits
0x0000000001ffffffULL, // 25 = 345 - 320 bits
0x000000001fffffffULL, // 29 = 349 - 320 bits
0x00000000ffffffffULL, // 32 = 352 - 320 bits
0x00000007ffffffffULL, // 35 = 355 - 320 bits
0x0000003fffffffffULL, // 38 = 358 - 320 bits
0x000003ffffffffffULL, // 42 = 362 - 320 bits
0x00001fffffffffffULL, // 45 = 365 - 320 bits
0x0000ffffffffffffULL // 48 = 368 - 320 bits
};
// onehalf256M[] contains 1/2 positioned correctly for comparison with the
// high bits of f*; the high 128 bits of the 512-bit mask are 0
UINT64 onehalf256M[] = {
0x0000000000004000ULL, // 15 = 335 - 320 bits
0x0000000000040000ULL, // 19 = 339 - 320 bits
0x0000000000200000ULL, // 22 = 342 - 320 bits
0x0000000001000000ULL, // 25 = 345 - 320 bits
0x0000000010000000ULL, // 29 = 349 - 320 bits
0x0000000080000000ULL, // 32 = 352 - 320 bits
0x0000000400000000ULL, // 35 = 355 - 320 bits
0x0000002000000000ULL, // 38 = 358 - 320 bits
0x0000020000000000ULL, // 42 = 362 - 320 bits
0x0000100000000000ULL, // 45 = 365 - 320 bits
0x0000800000000000ULL // 48 = 368 - 320 bits
};
// char_table2[] is used to convert n to string, where 10 <= n <= 99
unsigned char char_table2[180] = {
'1', '0',
'1', '1',
'1', '2',
'1', '3',
'1', '4',
'1', '5',
'1', '6',
'1', '7',
'1', '8',
'1', '9',
'2', '0',
'2', '1',
'2', '2',
'2', '3',
'2', '4',
'2', '5',
'2', '6',
'2', '7',
'2', '8',
'2', '9',
'3', '0',
'3', '1',
'3', '2',
'3', '3',
'3', '4',
'3', '5',
'3', '6',
'3', '7',
'3', '8',
'3', '9',
'4', '0',
'4', '1',
'4', '2',
'4', '3',
'4', '4',
'4', '5',
'4', '6',
'4', '7',
'4', '8',
'4', '9',
'5', '0',
'5', '1',
'5', '2',
'5', '3',
'5', '4',
'5', '5',
'5', '6',
'5', '7',
'5', '8',
'5', '9',
'6', '0',
'6', '1',
'6', '2',
'6', '3',
'6', '4',
'6', '5',
'6', '6',
'6', '7',
'6', '8',
'6', '9',
'7', '0',
'7', '1',
'7', '2',
'7', '3',
'7', '4',
'7', '5',
'7', '6',
'7', '7',
'7', '8',
'7', '9',
'8', '0',
'8', '1',
'8', '2',
'8', '3',
'8', '4',
'8', '5',
'8', '6',
'8', '7',
'8', '8',
'8', '9',
'9', '0',
'9', '1',
'9', '2',
'9', '3',
'9', '4',
'9', '5',
'9', '6',
'9', '7',
'9', '8',
'9', '9'
};
// char_table3[] is used to convert n to string, where 000 <= n <= 999
unsigned char char_table3[3000] = {
'0', '0', '0',
'0', '0', '1',
'0', '0', '2',
'0', '0', '3',
'0', '0', '4',
'0', '0', '5',
'0', '0', '6',
'0', '0', '7',
'0', '0', '8',
'0', '0', '9',
'0', '1', '0',
'0', '1', '1',
'0', '1', '2',
'0', '1', '3',
'0', '1', '4',
'0', '1', '5',
'0', '1', '6',
'0', '1', '7',
'0', '1', '8',
'0', '1', '9',
'0', '2', '0',
'0', '2', '1',
'0', '2', '2',
'0', '2', '3',
'0', '2', '4',
'0', '2', '5',
'0', '2', '6',
'0', '2', '7',
'0', '2', '8',
'0', '2', '9',
'0', '3', '0',
'0', '3', '1',
'0', '3', '2',
'0', '3', '3',
'0', '3', '4',
'0', '3', '5',
'0', '3', '6',
'0', '3', '7',
'0', '3', '8',
'0', '3', '9',
'0', '4', '0',
'0', '4', '1',
'0', '4', '2',
'0', '4', '3',
'0', '4', '4',
'0', '4', '5',
'0', '4', '6',
'0', '4', '7',
'0', '4', '8',
'0', '4', '9',
'0', '5', '0',
'0', '5', '1',
'0', '5', '2',
'0', '5', '3',
'0', '5', '4',
'0', '5', '5',
'0', '5', '6',
'0', '5', '7',
'0', '5', '8',
'0', '5', '9',
'0', '6', '0',
'0', '6', '1',
'0', '6', '2',
'0', '6', '3',
'0', '6', '4',
'0', '6', '5',
'0', '6', '6',
'0', '6', '7',
'0', '6', '8',
'0', '6', '9',
'0', '7', '0',
'0', '7', '1',
'0', '7', '2',
'0', '7', '3',
'0', '7', '4',
'0', '7', '5',
'0', '7', '6',
'0', '7', '7',
'0', '7', '8',
'0', '7', '9',
'0', '8', '0',
'0', '8', '1',
'0', '8', '2',
'0', '8', '3',
'0', '8', '4',
'0', '8', '5',
'0', '8', '6',
'0', '8', '7',
'0', '8', '8',
'0', '8', '9',
'0', '9', '0',
'0', '9', '1',
'0', '9', '2',
'0', '9', '3',
'0', '9', '4',
'0', '9', '5',
'0', '9', '6',
'0', '9', '7',
'0', '9', '8',
'0', '9', '9',
'1', '0', '0',
'1', '0', '1',
'1', '0', '2',
'1', '0', '3',
'1', '0', '4',
'1', '0', '5',
'1', '0', '6',
'1', '0', '7',
'1', '0', '8',
'1', '0', '9',
'1', '1', '0',
'1', '1', '1',
'1', '1', '2',
'1', '1', '3',
'1', '1', '4',
'1', '1', '5',
'1', '1', '6',
'1', '1', '7',
'1', '1', '8',
'1', '1', '9',
'1', '2', '0',
'1', '2', '1',
'1', '2', '2',
'1', '2', '3',
'1', '2', '4',
'1', '2', '5',
'1', '2', '6',
'1', '2', '7',
'1', '2', '8',
'1', '2', '9',
'1', '3', '0',
'1', '3', '1',
'1', '3', '2',
'1', '3', '3',
'1', '3', '4',
'1', '3', '5',
'1', '3', '6',
'1', '3', '7',
'1', '3', '8',
'1', '3', '9',
'1', '4', '0',
'1', '4', '1',
'1', '4', '2',
'1', '4', '3',
'1', '4', '4',
'1', '4', '5',
'1', '4', '6',
'1', '4', '7',
'1', '4', '8',
'1', '4', '9',
'1', '5', '0',
'1', '5', '1',
'1', '5', '2',
'1', '5', '3',
'1', '5', '4',
'1', '5', '5',
'1', '5', '6',
'1', '5', '7',
'1', '5', '8',
'1', '5', '9',
'1', '6', '0',
'1', '6', '1',
'1', '6', '2',
'1', '6', '3',
'1', '6', '4',
'1', '6', '5',
'1', '6', '6',
'1', '6', '7',
'1', '6', '8',
'1', '6', '9',
'1', '7', '0',
'1', '7', '1',
'1', '7', '2',
'1', '7', '3',
'1', '7', '4',
'1', '7', '5',
'1', '7', '6',
'1', '7', '7',
'1', '7', '8',
'1', '7', '9',
'1', '8', '0',
'1', '8', '1',
'1', '8', '2',
'1', '8', '3',
'1', '8', '4',
'1', '8', '5',
'1', '8', '6',
'1', '8', '7',
'1', '8', '8',
'1', '8', '9',
'1', '9', '0',
'1', '9', '1',
'1', '9', '2',
'1', '9', '3',
'1', '9', '4',
'1', '9', '5',
'1', '9', '6',
'1', '9', '7',
'1', '9', '8',
'1', '9', '9',
'2', '0', '0',
'2', '0', '1',
'2', '0', '2',
'2', '0', '3',
'2', '0', '4',
'2', '0', '5',
'2', '0', '6',
'2', '0', '7',
'2', '0', '8',
'2', '0', '9',
'2', '1', '0',
'2', '1', '1',
'2', '1', '2',
'2', '1', '3',
'2', '1', '4',
'2', '1', '5',
'2', '1', '6',
'2', '1', '7',
'2', '1', '8',
'2', '1', '9',
'2', '2', '0',
'2', '2', '1',
'2', '2', '2',
'2', '2', '3',
'2', '2', '4',
'2', '2', '5',
'2', '2', '6',
'2', '2', '7',
'2', '2', '8',
'2', '2', '9',
'2', '3', '0',
'2', '3', '1',
'2', '3', '2',
'2', '3', '3',
'2', '3', '4',
'2', '3', '5',
'2', '3', '6',
'2', '3', '7',
'2', '3', '8',
'2', '3', '9',
'2', '4', '0',
'2', '4', '1',
'2', '4', '2',
'2', '4', '3',
'2', '4', '4',
'2', '4', '5',
'2', '4', '6',
'2', '4', '7',
'2', '4', '8',
'2', '4', '9',
'2', '5', '0',
'2', '5', '1',
'2', '5', '2',
'2', '5', '3',
'2', '5', '4',
'2', '5', '5',
'2', '5', '6',
'2', '5', '7',
'2', '5', '8',
'2', '5', '9',
'2', '6', '0',
'2', '6', '1',
'2', '6', '2',
'2', '6', '3',
'2', '6', '4',
'2', '6', '5',
'2', '6', '6',
'2', '6', '7',
'2', '6', '8',
'2', '6', '9',
'2', '7', '0',
'2', '7', '1',
'2', '7', '2',
'2', '7', '3',
'2', '7', '4',
'2', '7', '5',
'2', '7', '6',
'2', '7', '7',
'2', '7', '8',
'2', '7', '9',
'2', '8', '0',
'2', '8', '1',
'2', '8', '2',
'2', '8', '3',
'2', '8', '4',
'2', '8', '5',
'2', '8', '6',
'2', '8', '7',
'2', '8', '8',
'2', '8', '9',
'2', '9', '0',
'2', '9', '1',
'2', '9', '2',
'2', '9', '3',
'2', '9', '4',
'2', '9', '5',
'2', '9', '6',
'2', '9', '7',
'2', '9', '8',
'2', '9', '9',
'3', '0', '0',
'3', '0', '1',
'3', '0', '2',
'3', '0', '3',
'3', '0', '4',
'3', '0', '5',
'3', '0', '6',
'3', '0', '7',
'3', '0', '8',
'3', '0', '9',
'3', '1', '0',
'3', '1', '1',
'3', '1', '2',
'3', '1', '3',
'3', '1', '4',
'3', '1', '5',
'3', '1', '6',
'3', '1', '7',
'3', '1', '8',
'3', '1', '9',
'3', '2', '0',
'3', '2', '1',
'3', '2', '2',
'3', '2', '3',
'3', '2', '4',
'3', '2', '5',
'3', '2', '6',
'3', '2', '7',
'3', '2', '8',
'3', '2', '9',
'3', '3', '0',
'3', '3', '1',
'3', '3', '2',
'3', '3', '3',
'3', '3', '4',
'3', '3', '5',
'3', '3', '6',
'3', '3', '7',
'3', '3', '8',
'3', '3', '9',
'3', '4', '0',
'3', '4', '1',
'3', '4', '2',
'3', '4', '3',
'3', '4', '4',
'3', '4', '5',
'3', '4', '6',
'3', '4', '7',
'3', '4', '8',
'3', '4', '9',
'3', '5', '0',
'3', '5', '1',
'3', '5', '2',
'3', '5', '3',
'3', '5', '4',
'3', '5', '5',
'3', '5', '6',
'3', '5', '7',
'3', '5', '8',
'3', '5', '9',
'3', '6', '0',
'3', '6', '1',
'3', '6', '2',
'3', '6', '3',
'3', '6', '4',
'3', '6', '5',
'3', '6', '6',
'3', '6', '7',
'3', '6', '8',
'3', '6', '9',
'3', '7', '0',
'3', '7', '1',
'3', '7', '2',
'3', '7', '3',
'3', '7', '4',
'3', '7', '5',
'3', '7', '6',
'3', '7', '7',
'3', '7', '8',
'3', '7', '9',
'3', '8', '0',
'3', '8', '1',
'3', '8', '2',
'3', '8', '3',
'3', '8', '4',
'3', '8', '5',
'3', '8', '6',
'3', '8', '7',
'3', '8', '8',
'3', '8', '9',
'3', '9', '0',
'3', '9', '1',
'3', '9', '2',
'3', '9', '3',
'3', '9', '4',
'3', '9', '5',
'3', '9', '6',
'3', '9', '7',
'3', '9', '8',
'3', '9', '9',
'4', '0', '0',
'4', '0', '1',
'4', '0', '2',
'4', '0', '3',
'4', '0', '4',
'4', '0', '5',
'4', '0', '6',
'4', '0', '7',
'4', '0', '8',
'4', '0', '9',
'4', '1', '0',
'4', '1', '1',
'4', '1', '2',
'4', '1', '3',
'4', '1', '4',
'4', '1', '5',
'4', '1', '6',
'4', '1', '7',
'4', '1', '8',
'4', '1', '9',
'4', '2', '0',
'4', '2', '1',
'4', '2', '2',
'4', '2', '3',
'4', '2', '4',
'4', '2', '5',
'4', '2', '6',
'4', '2', '7',
'4', '2', '8',
'4', '2', '9',
'4', '3', '0',
'4', '3', '1',
'4', '3', '2',
'4', '3', '3',
'4', '3', '4',
'4', '3', '5',
'4', '3', '6',
'4', '3', '7',
'4', '3', '8',
'4', '3', '9',
'4', '4', '0',
'4', '4', '1',
'4', '4', '2',
'4', '4', '3',
'4', '4', '4',
'4', '4', '5',
'4', '4', '6',
'4', '4', '7',
'4', '4', '8',
'4', '4', '9',
'4', '5', '0',
'4', '5', '1',
'4', '5', '2',
'4', '5', '3',
'4', '5', '4',
'4', '5', '5',
'4', '5', '6',
'4', '5', '7',
'4', '5', '8',
'4', '5', '9',
'4', '6', '0',
'4', '6', '1',
'4', '6', '2',
'4', '6', '3',
'4', '6', '4',
'4', '6', '5',
'4', '6', '6',
'4', '6', '7',
'4', '6', '8',
'4', '6', '9',
'4', '7', '0',
'4', '7', '1',
'4', '7', '2',
'4', '7', '3',
'4', '7', '4',
'4', '7', '5',
'4', '7', '6',
'4', '7', '7',
'4', '7', '8',
'4', '7', '9',
'4', '8', '0',
'4', '8', '1',
'4', '8', '2',
'4', '8', '3',
'4', '8', '4',
'4', '8', '5',
'4', '8', '6',
'4', '8', '7',
'4', '8', '8',
'4', '8', '9',
'4', '9', '0',
'4', '9', '1',
'4', '9', '2',
'4', '9', '3',
'4', '9', '4',
'4', '9', '5',
'4', '9', '6',
'4', '9', '7',
'4', '9', '8',
'4', '9', '9',
'5', '0', '0',
'5', '0', '1',
'5', '0', '2',
'5', '0', '3',
'5', '0', '4',
'5', '0', '5',
'5', '0', '6',
'5', '0', '7',
'5', '0', '8',
'5', '0', '9',
'5', '1', '0',
'5', '1', '1',
'5', '1', '2',
'5', '1', '3',
'5', '1', '4',
'5', '1', '5',
'5', '1', '6',
'5', '1', '7',
'5', '1', '8',
'5', '1', '9',
'5', '2', '0',
'5', '2', '1',
'5', '2', '2',
'5', '2', '3',
'5', '2', '4',
'5', '2', '5',
'5', '2', '6',
'5', '2', '7',
'5', '2', '8',
'5', '2', '9',
'5', '3', '0',
'5', '3', '1',
'5', '3', '2',
'5', '3', '3',
'5', '3', '4',
'5', '3', '5',
'5', '3', '6',
'5', '3', '7',
'5', '3', '8',
'5', '3', '9',
'5', '4', '0',
'5', '4', '1',
'5', '4', '2',
'5', '4', '3',
'5', '4', '4',
'5', '4', '5',
'5', '4', '6',
'5', '4', '7',
'5', '4', '8',
'5', '4', '9',
'5', '5', '0',
'5', '5', '1',
'5', '5', '2',
'5', '5', '3',
'5', '5', '4',
'5', '5', '5',
'5', '5', '6',
'5', '5', '7',
'5', '5', '8',
'5', '5', '9',
'5', '6', '0',
'5', '6', '1',
'5', '6', '2',
'5', '6', '3',
'5', '6', '4',
'5', '6', '5',
'5', '6', '6',
'5', '6', '7',
'5', '6', '8',
'5', '6', '9',
'5', '7', '0',
'5', '7', '1',
'5', '7', '2',
'5', '7', '3',
'5', '7', '4',
'5', '7', '5',
'5', '7', '6',
'5', '7', '7',
'5', '7', '8',
'5', '7', '9',
'5', '8', '0',
'5', '8', '1',
'5', '8', '2',
'5', '8', '3',
'5', '8', '4',
'5', '8', '5',
'5', '8', '6',
'5', '8', '7',
'5', '8', '8',
'5', '8', '9',
'5', '9', '0',
'5', '9', '1',
'5', '9', '2',
'5', '9', '3',
'5', '9', '4',
'5', '9', '5',
'5', '9', '6',
'5', '9', '7',
'5', '9', '8',
'5', '9', '9',
'6', '0', '0',
'6', '0', '1',
'6', '0', '2',
'6', '0', '3',
'6', '0', '4',
'6', '0', '5',
'6', '0', '6',
'6', '0', '7',
'6', '0', '8',
'6', '0', '9',
'6', '1', '0',
'6', '1', '1',
'6', '1', '2',
'6', '1', '3',
'6', '1', '4',
'6', '1', '5',
'6', '1', '6',
'6', '1', '7',
'6', '1', '8',
'6', '1', '9',
'6', '2', '0',
'6', '2', '1',
'6', '2', '2',
'6', '2', '3',
'6', '2', '4',
'6', '2', '5',
'6', '2', '6',
'6', '2', '7',
'6', '2', '8',
'6', '2', '9',
'6', '3', '0',
'6', '3', '1',
'6', '3', '2',
'6', '3', '3',
'6', '3', '4',
'6', '3', '5',
'6', '3', '6',
'6', '3', '7',
'6', '3', '8',
'6', '3', '9',
'6', '4', '0',
'6', '4', '1',
'6', '4', '2',
'6', '4', '3',
'6', '4', '4',
'6', '4', '5',
'6', '4', '6',
'6', '4', '7',
'6', '4', '8',
'6', '4', '9',
'6', '5', '0',
'6', '5', '1',
'6', '5', '2',
'6', '5', '3',
'6', '5', '4',
'6', '5', '5',
'6', '5', '6',
'6', '5', '7',
'6', '5', '8',
'6', '5', '9',
'6', '6', '0',
'6', '6', '1',
'6', '6', '2',
'6', '6', '3',
'6', '6', '4',
'6', '6', '5',
'6', '6', '6',
'6', '6', '7',
'6', '6', '8',
'6', '6', '9',
'6', '7', '0',
'6', '7', '1',
'6', '7', '2',
'6', '7', '3',
'6', '7', '4',
'6', '7', '5',
'6', '7', '6',
'6', '7', '7',
'6', '7', '8',
'6', '7', '9',
'6', '8', '0',
'6', '8', '1',
'6', '8', '2',
'6', '8', '3',
'6', '8', '4',
'6', '8', '5',
'6', '8', '6',
'6', '8', '7',
'6', '8', '8',
'6', '8', '9',
'6', '9', '0',
'6', '9', '1',
'6', '9', '2',
'6', '9', '3',
'6', '9', '4',
'6', '9', '5',
'6', '9', '6',
'6', '9', '7',
'6', '9', '8',
'6', '9', '9',
'7', '0', '0',
'7', '0', '1',
'7', '0', '2',
'7', '0', '3',
'7', '0', '4',
'7', '0', '5',
'7', '0', '6',
'7', '0', '7',
'7', '0', '8',
'7', '0', '9',
'7', '1', '0',
'7', '1', '1',
'7', '1', '2',
'7', '1', '3',
'7', '1', '4',
'7', '1', '5',
'7', '1', '6',
'7', '1', '7',
'7', '1', '8',
'7', '1', '9',
'7', '2', '0',
'7', '2', '1',
'7', '2', '2',
'7', '2', '3',
'7', '2', '4',
'7', '2', '5',
'7', '2', '6',
'7', '2', '7',
'7', '2', '8',
'7', '2', '9',
'7', '3', '0',
'7', '3', '1',
'7', '3', '2',
'7', '3', '3',
'7', '3', '4',
'7', '3', '5',
'7', '3', '6',
'7', '3', '7',
'7', '3', '8',
'7', '3', '9',
'7', '4', '0',
'7', '4', '1',
'7', '4', '2',
'7', '4', '3',
'7', '4', '4',
'7', '4', '5',
'7', '4', '6',
'7', '4', '7',
'7', '4', '8',
'7', '4', '9',
'7', '5', '0',
'7', '5', '1',
'7', '5', '2',
'7', '5', '3',
'7', '5', '4',
'7', '5', '5',
'7', '5', '6',
'7', '5', '7',
'7', '5', '8',
'7', '5', '9',
'7', '6', '0',
'7', '6', '1',
'7', '6', '2',
'7', '6', '3',
'7', '6', '4',
'7', '6', '5',
'7', '6', '6',
'7', '6', '7',
'7', '6', '8',
'7', '6', '9',
'7', '7', '0',
'7', '7', '1',
'7', '7', '2',
'7', '7', '3',
'7', '7', '4',
'7', '7', '5',
'7', '7', '6',
'7', '7', '7',
'7', '7', '8',
'7', '7', '9',
'7', '8', '0',
'7', '8', '1',
'7', '8', '2',
'7', '8', '3',
'7', '8', '4',
'7', '8', '5',
'7', '8', '6',
'7', '8', '7',
'7', '8', '8',
'7', '8', '9',
'7', '9', '0',
'7', '9', '1',
'7', '9', '2',
'7', '9', '3',
'7', '9', '4',
'7', '9', '5',
'7', '9', '6',
'7', '9', '7',
'7', '9', '8',
'7', '9', '9',
'8', '0', '0',
'8', '0', '1',
'8', '0', '2',
'8', '0', '3',
'8', '0', '4',
'8', '0', '5',
'8', '0', '6',
'8', '0', '7',
'8', '0', '8',
'8', '0', '9',
'8', '1', '0',
'8', '1', '1',
'8', '1', '2',
'8', '1', '3',
'8', '1', '4',
'8', '1', '5',
'8', '1', '6',
'8', '1', '7',
'8', '1', '8',
'8', '1', '9',
'8', '2', '0',
'8', '2', '1',
'8', '2', '2',
'8', '2', '3',
'8', '2', '4',
'8', '2', '5',
'8', '2', '6',
'8', '2', '7',
'8', '2', '8',
'8', '2', '9',
'8', '3', '0',
'8', '3', '1',
'8', '3', '2',
'8', '3', '3',
'8', '3', '4',
'8', '3', '5',
'8', '3', '6',
'8', '3', '7',
'8', '3', '8',
'8', '3', '9',
'8', '4', '0',
'8', '4', '1',
'8', '4', '2',
'8', '4', '3',
'8', '4', '4',
'8', '4', '5',
'8', '4', '6',
'8', '4', '7',
'8', '4', '8',
'8', '4', '9',
'8', '5', '0',
'8', '5', '1',
'8', '5', '2',
'8', '5', '3',
'8', '5', '4',
'8', '5', '5',
'8', '5', '6',
'8', '5', '7',
'8', '5', '8',
'8', '5', '9',
'8', '6', '0',
'8', '6', '1',
'8', '6', '2',
'8', '6', '3',
'8', '6', '4',
'8', '6', '5',
'8', '6', '6',
'8', '6', '7',
'8', '6', '8',
'8', '6', '9',
'8', '7', '0',
'8', '7', '1',
'8', '7', '2',
'8', '7', '3',
'8', '7', '4',
'8', '7', '5',
'8', '7', '6',
'8', '7', '7',
'8', '7', '8',
'8', '7', '9',
'8', '8', '0',
'8', '8', '1',
'8', '8', '2',
'8', '8', '3',
'8', '8', '4',
'8', '8', '5',
'8', '8', '6',
'8', '8', '7',
'8', '8', '8',
'8', '8', '9',
'8', '9', '0',
'8', '9', '1',
'8', '9', '2',
'8', '9', '3',
'8', '9', '4',
'8', '9', '5',
'8', '9', '6',
'8', '9', '7',
'8', '9', '8',
'8', '9', '9',
'9', '0', '0',
'9', '0', '1',
'9', '0', '2',
'9', '0', '3',
'9', '0', '4',
'9', '0', '5',
'9', '0', '6',
'9', '0', '7',
'9', '0', '8',
'9', '0', '9',
'9', '1', '0',
'9', '1', '1',
'9', '1', '2',
'9', '1', '3',
'9', '1', '4',
'9', '1', '5',
'9', '1', '6',
'9', '1', '7',
'9', '1', '8',
'9', '1', '9',
'9', '2', '0',
'9', '2', '1',
'9', '2', '2',
'9', '2', '3',
'9', '2', '4',
'9', '2', '5',
'9', '2', '6',
'9', '2', '7',
'9', '2', '8',
'9', '2', '9',
'9', '3', '0',
'9', '3', '1',
'9', '3', '2',
'9', '3', '3',
'9', '3', '4',
'9', '3', '5',
'9', '3', '6',
'9', '3', '7',
'9', '3', '8',
'9', '3', '9',
'9', '4', '0',
'9', '4', '1',
'9', '4', '2',
'9', '4', '3',
'9', '4', '4',
'9', '4', '5',
'9', '4', '6',
'9', '4', '7',
'9', '4', '8',
'9', '4', '9',
'9', '5', '0',
'9', '5', '1',
'9', '5', '2',
'9', '5', '3',
'9', '5', '4',
'9', '5', '5',
'9', '5', '6',
'9', '5', '7',
'9', '5', '8',
'9', '5', '9',
'9', '6', '0',
'9', '6', '1',
'9', '6', '2',
'9', '6', '3',
'9', '6', '4',
'9', '6', '5',
'9', '6', '6',
'9', '6', '7',
'9', '6', '8',
'9', '6', '9',
'9', '7', '0',
'9', '7', '1',
'9', '7', '2',
'9', '7', '3',
'9', '7', '4',
'9', '7', '5',
'9', '7', '6',
'9', '7', '7',
'9', '7', '8',
'9', '7', '9',
'9', '8', '0',
'9', '8', '1',
'9', '8', '2',
'9', '8', '3',
'9', '8', '4',
'9', '8', '5',
'9', '8', '6',
'9', '8', '7',
'9', '8', '8',
'9', '8', '9',
'9', '9', '0',
'9', '9', '1',
'9', '9', '2',
'9', '9', '3',
'9', '9', '4',
'9', '9', '5',
'9', '9', '6',
'9', '9', '7',
'9', '9', '8',
'9', '9', '9'
};
// ten2m3k64[], shift_ten2m3k64[] used for conversion from BID128 to string
UINT64 ten2m3k64[] = {
0x4189374bc6a7ef9eull, // 4189374bc6a7ef9e * 2^-72 = (10^-3)RP,63
0x10c6f7a0b5ed8d37ull, // 10c6f7a0b5ed8d37 * 2^-80 = (10^-6)RP,61
0x44b82fa09b5a52ccull, // 44b82fa09b5a52cc * 2^-92 = (10^-9)RP,63
0x119799812dea111aull, // 119799812dea111a * 2^-100 = (10^-12)RP,61
0x480ebe7b9d58566dull // 480ebe7b9d58566d * 2^-112 = (10^-15)RP,63
};
unsigned int shift_ten2m3k64[] = {
8, // 72 - 64
16, // 80 - 64
28, // 92 - 64
36, // 100 - 64
48 // 112 - 64
};
UINT128 ten2m3k128[] = {
{{0xb22d0e5604189375ull, 0x4189374bc6a7ef9dull}},
// 4189374bc6a7ef9d b22d0e5604189375 * 2^-136 = (10^-3)RP,127
{{0xb4c7f34938583622ull, 0x10c6f7a0b5ed8d36ull}},
// 10c6f7a0b5ed8d36 b4c7f34938583622 * 2^-144 = (10^-6)RP,125
{{0x98b405447c4a9819ull, 0x44b82fa09b5a52cbull}},
// 44b82fa09b5a52cb 98b405447c4a9819 * 2^-156 = (10^-9)RP,127
{{0x7f27f0f6e885c8bbull, 0x119799812dea1119ull}},
// 119799812dea1119 7f27f0f6e885c8bb * 2^-164 = (10^-12)RP,125
{{0x87ce9b80a5fb0509ull, 0x480ebe7b9d58566cull}},
// 480ebe7b9d58566c 87ce9b80a5fb0509 * 2^-176 = (10^-15)RP,127
{{0xe75fe645cc4873faull, 0x12725dd1d243aba0ull}},
// 12725dd1d243aba0 e75fe645cc4873fa * 2^-184 = (10^-18)RP,125
{{0x69fb7e0b75e52f02ull, 0x4b8ed0283a6d3df7ull}},
// 4b8ed0283a6d3df7 69fb7e0b75e52f02 * 2^-196 = (10^-21)RP,127
{{0x58924d52ce4f26a9ull, 0x1357c299a88ea76aull}},
// 1357c299a88ea76a 58924d52ce4f26a9 * 2^-204 = (10^-24)RP,125
{{0x3baf513267aa9a3full, 0x4f3a68dbc8f03f24ull}},
// 4f3a68dbc8f03f24 3baf513267aa9a3f * 2^-216 = (10^-27)RP,127
{{0x3424b06f3529a052ull, 0x14484bfeebc29f86ull}},
// 14484bfeebc29f86 3424b06f3529a052 * 2^-224 = (10^-30)RP,125
{{0xf658d6c57566eac8ull, 0x5313a5dee87d6eb0ull}}
// 5313a5dee87d6eb0 f658d6c57566eac8 * 2^-236 = (10^-33)RP,127
};
unsigned int shift_ten2m3k128[] = {
8, // 136 - 128
16, // 144 - 128
28, // 156 - 128
36, // 164 - 128
48, // 176 - 128
56, // 184 - 128
4, // 196 - 192
12, // 204 - 192
24, // 216 - 192
32, // 224 - 192
44 // 236 - 192
};
/***************************************************************************
*************** TABLES FOR GENERAL ROUNDING FUNCTIONS *********************
***************************************************************************/
// Note: not all entries in these tables will be used with IEEE 754R decimal
// floating-point arithmetic
// a) In round128_2_18() numbers with 2 <= q <= 18 will be rounded only
// for 1 <= x <= 3:
// x = 1 or x = 2 when q = 17
// x = 2 or x = 3 when q = 18
// b) In round128_19_38() numbers with 19 <= q <= 38 will be rounded only
// for 1 <= x <= 23:
// x = 3 or x = 4 when q = 19
// x = 4 or x = 5 when q = 20
// ...
// x = 18 or x = 19 when q = 34
// x = 1 or x = 2 or x = 19 or x = 20 when q = 35
// x = 2 or x = 3 or x = 20 or x = 21 when q = 36
// x = 3 or x = 4 or x = 21 or x = 22 when q = 37
// x = 4 or x = 5 or x = 22 or x = 23 when q = 38
// c) ...
// However, for generality and possible uses outside the frame of IEEE 754R
// this implementation includes table values for all x in [1, q - 1]
// Note: 64-bit tables generated with ten2mx64.ma; output in ten2mx64.out
// Kx from 10^(-x) ~= Kx * 2^(-Ex); Kx rounded up to 64 bits, 1 <= x <= 17
UINT64 Kx64[] = {
0xcccccccccccccccdULL, // 10^-1 ~= cccccccccccccccd * 2^-67
0xa3d70a3d70a3d70bULL, // 10^-2 ~= a3d70a3d70a3d70b * 2^-70
0x83126e978d4fdf3cULL, // 10^-3 ~= 83126e978d4fdf3c * 2^-73
0xd1b71758e219652cULL, // 10^-4 ~= d1b71758e219652c * 2^-77
0xa7c5ac471b478424ULL, // 10^-5 ~= a7c5ac471b478424 * 2^-80
0x8637bd05af6c69b6ULL, // 10^-6 ~= 8637bd05af6c69b6 * 2^-83
0xd6bf94d5e57a42bdULL, // 10^-7 ~= d6bf94d5e57a42bd * 2^-87
0xabcc77118461cefdULL, // 10^-8 ~= abcc77118461cefd * 2^-90
0x89705f4136b4a598ULL, // 10^-9 ~= 89705f4136b4a598 * 2^-93
0xdbe6fecebdedd5bfULL, // 10^-10 ~= dbe6fecebdedd5bf * 2^-97
0xafebff0bcb24aaffULL, // 10^-11 ~= afebff0bcb24aaff * 2^-100
0x8cbccc096f5088ccULL, // 10^-12 ~= 8cbccc096f5088cc * 2^-103
0xe12e13424bb40e14ULL, // 10^-13 ~= e12e13424bb40e14 * 2^-107
0xb424dc35095cd810ULL, // 10^-14 ~= b424dc35095cd810 * 2^-110
0x901d7cf73ab0acdaULL, // 10^-15 ~= 901d7cf73ab0acda * 2^-113
0xe69594bec44de15cULL, // 10^-16 ~= e69594bec44de15c * 2^-117
0xb877aa3236a4b44aULL // 10^-17 ~= b877aa3236a4b44a * 2^-120
};
// Ex-64 from 10^(-x) ~= Kx * 2^(-Ex); Kx rounded up to 64 bits, 1 <= x <= 17
unsigned int Ex64m64[] = {
3, // 67 - 64, Ex = 67
6, // 70 - 64, Ex = 70
9, // 73 - 64, Ex = 73
13, // 77 - 64, Ex = 77
16, // 80 - 64, Ex = 80
19, // 83 - 64, Ex = 83
23, // 87 - 64, Ex = 87
26, // 90 - 64, Ex = 90
29, // 93 - 64, Ex = 93
33, // 97 - 64, Ex = 97
36, // 100 - 64, Ex = 100
39, // 103 - 64, Ex = 103
43, // 107 - 64, Ex = 107
46, // 110 - 64, Ex = 110
49, // 113 - 64, Ex = 113
53, // 117 - 64, Ex = 117
56 // 120 - 64, Ex = 120
};
// Values of 1/2 in the right position to be compared with the fraction from
// C * kx, 1 <= x <= 17; the fraction consists of the low Ex bits in C * kx
// (these values are aligned with the high 64 bits of the fraction)
UINT64 half64[] = {
0x0000000000000004ULL, // half / 2^64 = 4
0x0000000000000020ULL, // half / 2^64 = 20
0x0000000000000100ULL, // half / 2^64 = 100
0x0000000000001000ULL, // half / 2^64 = 1000
0x0000000000008000ULL, // half / 2^64 = 8000
0x0000000000040000ULL, // half / 2^64 = 40000
0x0000000000400000ULL, // half / 2^64 = 400000
0x0000000002000000ULL, // half / 2^64 = 2000000
0x0000000010000000ULL, // half / 2^64 = 10000000
0x0000000100000000ULL, // half / 2^64 = 100000000
0x0000000800000000ULL, // half / 2^64 = 800000000
0x0000004000000000ULL, // half / 2^64 = 4000000000
0x0000040000000000ULL, // half / 2^64 = 40000000000
0x0000200000000000ULL, // half / 2^64 = 200000000000
0x0001000000000000ULL, // half / 2^64 = 1000000000000
0x0010000000000000ULL, // half / 2^64 = 10000000000000
0x0080000000000000ULL // half / 2^64 = 80000000000000
};
// Values of mask in the right position to obtain the high Ex - 64 bits
// of the fraction from C * kx, 1 <= x <= 17; the fraction consists of
// the low Ex bits in C * kx
UINT64 mask64[] = {
0x0000000000000007ULL, // mask / 2^64
0x000000000000003fULL, // mask / 2^64
0x00000000000001ffULL, // mask / 2^64
0x0000000000001fffULL, // mask / 2^64
0x000000000000ffffULL, // mask / 2^64
0x000000000007ffffULL, // mask / 2^64
0x00000000007fffffULL, // mask / 2^64
0x0000000003ffffffULL, // mask / 2^64
0x000000001fffffffULL, // mask / 2^64
0x00000001ffffffffULL, // mask / 2^64
0x0000000fffffffffULL, // mask / 2^64
0x0000007fffffffffULL, // mask / 2^64
0x000007ffffffffffULL, // mask / 2^64
0x00003fffffffffffULL, // mask / 2^64
0x0001ffffffffffffULL, // mask / 2^64
0x001fffffffffffffULL, // mask / 2^64
0x00ffffffffffffffULL // mask / 2^64
};
// Values of 10^(-x) trancated to Ex bits beyond the binary point, and
// in the right position to be compared with the fraction from C * kx,
// 1 <= x <= 17; the fraction consists of the low Ex bits in C * kx
// (these values are aligned with the low 64 bits of the fraction)
UINT64 ten2mxtrunc64[] = {
0xccccccccccccccccULL, // (ten2mx >> 64) = cccccccccccccccc
0xa3d70a3d70a3d70aULL, // (ten2mx >> 64) = a3d70a3d70a3d70a
0x83126e978d4fdf3bULL, // (ten2mx >> 64) = 83126e978d4fdf3b
0xd1b71758e219652bULL, // (ten2mx >> 64) = d1b71758e219652b
0xa7c5ac471b478423ULL, // (ten2mx >> 64) = a7c5ac471b478423
0x8637bd05af6c69b5ULL, // (ten2mx >> 64) = 8637bd05af6c69b5
0xd6bf94d5e57a42bcULL, // (ten2mx >> 64) = d6bf94d5e57a42bc
0xabcc77118461cefcULL, // (ten2mx >> 64) = abcc77118461cefc
0x89705f4136b4a597ULL, // (ten2mx >> 64) = 89705f4136b4a597
0xdbe6fecebdedd5beULL, // (ten2mx >> 64) = dbe6fecebdedd5be
0xafebff0bcb24aafeULL, // (ten2mx >> 64) = afebff0bcb24aafe
0x8cbccc096f5088cbULL, // (ten2mx >> 64) = 8cbccc096f5088cb
0xe12e13424bb40e13ULL, // (ten2mx >> 64) = e12e13424bb40e13
0xb424dc35095cd80fULL, // (ten2mx >> 64) = b424dc35095cd80f
0x901d7cf73ab0acd9ULL, // (ten2mx >> 64) = 901d7cf73ab0acd9
0xe69594bec44de15bULL, // (ten2mx >> 64) = e69594bec44de15b
0xb877aa3236a4b449ULL // (ten2mx >> 64) = b877aa3236a4b449
};
// Note: 128-bit tables generated with ten2mx128.ma; output in ten2mx128.out
// The order of the 64-bit components is L, H
// Kx from 10^(-x) ~= Kx * 2^(-Ex); Kx rounded up to 128 bits, 1 <= x <= 37
UINT128 Kx128[] = {
{{0xcccccccccccccccdULL, 0xccccccccccccccccULL}},
// 10^-1 ~= cccccccccccccccccccccccccccccccd * 2^-131
{{0x3d70a3d70a3d70a4ULL, 0xa3d70a3d70a3d70aULL}},
// 10^-2 ~= a3d70a3d70a3d70a3d70a3d70a3d70a4 * 2^-134
{{0x645a1cac083126eaULL, 0x83126e978d4fdf3bULL}},
// 10^-3 ~= 83126e978d4fdf3b645a1cac083126ea * 2^-137
{{0xd3c36113404ea4a9ULL, 0xd1b71758e219652bULL}},
// 10^-4 ~= d1b71758e219652bd3c36113404ea4a9 * 2^-141
{{0x0fcf80dc33721d54ULL, 0xa7c5ac471b478423ULL}},
// 10^-5 ~= a7c5ac471b4784230fcf80dc33721d54 * 2^-144
{{0xa63f9a49c2c1b110ULL, 0x8637bd05af6c69b5ULL}},
// 10^-6 ~= 8637bd05af6c69b5a63f9a49c2c1b110 * 2^-147
{{0x3d32907604691b4dULL, 0xd6bf94d5e57a42bcULL}},
// 10^-7 ~= d6bf94d5e57a42bc3d32907604691b4d * 2^-151
{{0xfdc20d2b36ba7c3eULL, 0xabcc77118461cefcULL}},
// 10^-8 ~= abcc77118461cefcfdc20d2b36ba7c3e * 2^-154
{{0x31680a88f8953031ULL, 0x89705f4136b4a597ULL}},
// 10^-9 ~= 89705f4136b4a59731680a88f8953031 * 2^-157
{{0xb573440e5a884d1cULL, 0xdbe6fecebdedd5beULL}},
// 10^-10 ~= dbe6fecebdedd5beb573440e5a884d1c * 2^-161
{{0xf78f69a51539d749ULL, 0xafebff0bcb24aafeULL}},
// 10^-11 ~= afebff0bcb24aafef78f69a51539d749 * 2^-164
{{0xf93f87b7442e45d4ULL, 0x8cbccc096f5088cbULL}},
// 10^-12 ~= 8cbccc096f5088cbf93f87b7442e45d4 * 2^-167
{{0x2865a5f206b06fbaULL, 0xe12e13424bb40e13ULL}},
// 10^-13 ~= e12e13424bb40e132865a5f206b06fba * 2^-171
{{0x538484c19ef38c95ULL, 0xb424dc35095cd80fULL}},
// 10^-14 ~= b424dc35095cd80f538484c19ef38c95 * 2^-174
{{0x0f9d37014bf60a11ULL, 0x901d7cf73ab0acd9ULL}},
// 10^-15 ~= 901d7cf73ab0acd90f9d37014bf60a11 * 2^-177
{{0x4c2ebe687989a9b4ULL, 0xe69594bec44de15bULL}},
// 10^-16 ~= e69594bec44de15b4c2ebe687989a9b4 * 2^-181
{{0x09befeb9fad487c3ULL, 0xb877aa3236a4b449ULL}},
// 10^-17 ~= b877aa3236a4b44909befeb9fad487c3 * 2^-184
{{0x3aff322e62439fd0ULL, 0x9392ee8e921d5d07ULL}},
// 10^-18 ~= 9392ee8e921d5d073aff322e62439fd0 * 2^-187
{{0x2b31e9e3d06c32e6ULL, 0xec1e4a7db69561a5ULL}},
// 10^-19 ~= ec1e4a7db69561a52b31e9e3d06c32e6 * 2^-191
{{0x88f4bb1ca6bcf585ULL, 0xbce5086492111aeaULL}},
// 10^-20 ~= bce5086492111aea88f4bb1ca6bcf585 * 2^-194
{{0xd3f6fc16ebca5e04ULL, 0x971da05074da7beeULL}},
// 10^-21 ~= 971da05074da7beed3f6fc16ebca5e04 * 2^-197
{{0x5324c68b12dd6339ULL, 0xf1c90080baf72cb1ULL}},
// 10^-22 ~= f1c90080baf72cb15324c68b12dd6339 * 2^-201
{{0x75b7053c0f178294ULL, 0xc16d9a0095928a27ULL}},
// 10^-23 ~= c16d9a0095928a2775b7053c0f178294 * 2^-204
{{0xc4926a9672793543ULL, 0x9abe14cd44753b52ULL}},
// 10^-24 ~= 9abe14cd44753b52c4926a9672793543 * 2^-207
{{0x3a83ddbd83f52205ULL, 0xf79687aed3eec551ULL}},
// 10^-25 ~= f79687aed3eec5513a83ddbd83f52205 * 2^-211
{{0x95364afe032a819eULL, 0xc612062576589ddaULL}},
// 10^-26 ~= c612062576589dda95364afe032a819e * 2^-214
{{0x775ea264cf55347eULL, 0x9e74d1b791e07e48ULL}},
// 10^-27 ~= 9e74d1b791e07e48775ea264cf55347e * 2^-217
{{0x8bca9d6e188853fdULL, 0xfd87b5f28300ca0dULL}},
// 10^-28 ~= fd87b5f28300ca0d8bca9d6e188853fd * 2^-221
{{0x096ee45813a04331ULL, 0xcad2f7f5359a3b3eULL}},
// 10^-29 ~= cad2f7f5359a3b3e096ee45813a04331 * 2^-224
{{0xa1258379a94d028eULL, 0xa2425ff75e14fc31ULL}},
// 10^-30 ~= a2425ff75e14fc31a1258379a94d028e * 2^-227
{{0x80eacf948770ced8ULL, 0x81ceb32c4b43fcf4ULL}},
// 10^-31 ~= 81ceb32c4b43fcf480eacf948770ced8 * 2^-230
{{0x67de18eda5814af3ULL, 0xcfb11ead453994baULL}},
// 10^-32 ~= cfb11ead453994ba67de18eda5814af3 * 2^-234
{{0xecb1ad8aeacdd58fULL, 0xa6274bbdd0fadd61ULL}},
// 10^-33 ~= a6274bbdd0fadd61ecb1ad8aeacdd58f * 2^-237
{{0xbd5af13bef0b113fULL, 0x84ec3c97da624ab4ULL}},
// 10^-34 ~= 84ec3c97da624ab4bd5af13bef0b113f * 2^-240
{{0x955e4ec64b44e865ULL, 0xd4ad2dbfc3d07787ULL}},
// 10^-35 ~= d4ad2dbfc3d07787955e4ec64b44e865 * 2^-244
{{0xdde50bd1d5d0b9eaULL, 0xaa242499697392d2ULL}},
// 10^-36 ~= aa242499697392d2dde50bd1d5d0b9ea * 2^-247
{{0x7e50d64177da2e55ULL, 0x881cea14545c7575ULL}}
// 10^-37 ~= 881cea14545c75757e50d64177da2e55 * 2^-250
};
// Ex-128 from 10^(-x) ~= Kx*2^(-Ex); Kx rounded up to 128 bits, 1 <= x <= 37
unsigned int Ex128m128[] = {
3, // 131 - 128, Ex = 131
6, // 134 - 128, Ex = 134
9, // 137 - 128, Ex = 137
13, // 141 - 128, Ex = 141
16, // 144 - 128, Ex = 144
19, // 147 - 128, Ex = 147
23, // 151 - 128, Ex = 151
26, // 154 - 128, Ex = 154
29, // 157 - 128, Ex = 157
33, // 161 - 128, Ex = 161
36, // 164 - 128, Ex = 164
39, // 167 - 128, Ex = 167
43, // 171 - 128, Ex = 171
46, // 174 - 128, Ex = 174
49, // 177 - 128, Ex = 177
53, // 181 - 128, Ex = 181
56, // 184 - 128, Ex = 184
59, // 187 - 128, Ex = 187
63, // 191 - 128, Ex = 191
2, // 194 - 192, Ex = 194
5, // 197 - 192, Ex = 197
9, // 201 - 192, Ex = 201
12, // 204 - 192, Ex = 204
15, // 207 - 192, Ex = 207
19, // 211 - 192, Ex = 211
22, // 214 - 192, Ex = 214
25, // 217 - 192, Ex = 217
29, // 221 - 192, Ex = 221
32, // 224 - 192, Ex = 224
35, // 227 - 192, Ex = 227
38, // 230 - 192, Ex = 230
42, // 234 - 192, Ex = 234
45, // 237 - 192, Ex = 237
48, // 240 - 192, Ex = 240
52, // 244 - 192, Ex = 244
55, // 247 - 192, Ex = 247
58 // 250 - 192, Ex = 250
};
// Values of 1/2 in the right position to be compared with the fraction from
// C * kx, 1 <= x <= 37; the fraction consists of the low Ex bits in C * kx
// (these values are aligned with the high 128 bits of the fraction)
UINT64 half128[] = {
0x0000000000000004ULL, // half / 2^128 = 4
0x0000000000000020ULL, // half / 2^128 = 20
0x0000000000000100ULL, // half / 2^128 = 100
0x0000000000001000ULL, // half / 2^128 = 1000
0x0000000000008000ULL, // half / 2^128 = 8000
0x0000000000040000ULL, // half / 2^128 = 40000
0x0000000000400000ULL, // half / 2^128 = 400000
0x0000000002000000ULL, // half / 2^128 = 2000000
0x0000000010000000ULL, // half / 2^128 = 10000000
0x0000000100000000ULL, // half / 2^128 = 100000000
0x0000000800000000ULL, // half / 2^128 = 800000000
0x0000004000000000ULL, // half / 2^128 = 4000000000
0x0000040000000000ULL, // half / 2^128 = 40000000000
0x0000200000000000ULL, // half / 2^128 = 200000000000
0x0001000000000000ULL, // half / 2^128 = 1000000000000
0x0010000000000000ULL, // half / 2^128 = 10000000000000
0x0080000000000000ULL, // half / 2^128 = 80000000000000
0x0400000000000000ULL, // half / 2^128 = 400000000000000
0x4000000000000000ULL, // half / 2^128 = 4000000000000000
0x0000000000000002ULL, // half / 2^192 = 2
0x0000000000000010ULL, // half / 2^192 = 10
0x0000000000000100ULL, // half / 2^192 = 100
0x0000000000000800ULL, // half / 2^192 = 800
0x0000000000004000ULL, // half / 2^192 = 4000
0x0000000000040000ULL, // half / 2^192 = 40000
0x0000000000200000ULL, // half / 2^192 = 200000
0x0000000001000000ULL, // half / 2^192 = 1000000
0x0000000010000000ULL, // half / 2^192 = 10000000
0x0000000080000000ULL, // half / 2^192 = 80000000
0x0000000400000000ULL, // half / 2^192 = 400000000
0x0000002000000000ULL, // half / 2^192 = 2000000000
0x0000020000000000ULL, // half / 2^192 = 20000000000
0x0000100000000000ULL, // half / 2^192 = 100000000000
0x0000800000000000ULL, // half / 2^192 = 800000000000
0x0008000000000000ULL, // half / 2^192 = 8000000000000
0x0040000000000000ULL, // half / 2^192 = 40000000000000
0x0200000000000000ULL // half / 2^192 = 200000000000000
};
// Values of mask in the right position to obtain the high Ex - 128 or Ex - 192
// bits of the fraction from C * kx, 1 <= x <= 37; the fraction consists of
// the low Ex bits in C * kx
UINT64 mask128[] = {
0x0000000000000007ULL, // mask / 2^128
0x000000000000003fULL, // mask / 2^128
0x00000000000001ffULL, // mask / 2^128
0x0000000000001fffULL, // mask / 2^128
0x000000000000ffffULL, // mask / 2^128
0x000000000007ffffULL, // mask / 2^128
0x00000000007fffffULL, // mask / 2^128
0x0000000003ffffffULL, // mask / 2^128
0x000000001fffffffULL, // mask / 2^128
0x00000001ffffffffULL, // mask / 2^128
0x0000000fffffffffULL, // mask / 2^128
0x0000007fffffffffULL, // mask / 2^128
0x000007ffffffffffULL, // mask / 2^128
0x00003fffffffffffULL, // mask / 2^128
0x0001ffffffffffffULL, // mask / 2^128
0x001fffffffffffffULL, // mask / 2^128
0x00ffffffffffffffULL, // mask / 2^128
0x07ffffffffffffffULL, // mask / 2^128
0x7fffffffffffffffULL, // mask / 2^128
0x0000000000000003ULL, // mask / 2^192
0x000000000000001fULL, // mask / 2^192
0x00000000000001ffULL, // mask / 2^192
0x0000000000000fffULL, // mask / 2^192
0x0000000000007fffULL, // mask / 2^192
0x000000000007ffffULL, // mask / 2^192
0x00000000003fffffULL, // mask / 2^192
0x0000000001ffffffULL, // mask / 2^192
0x000000001fffffffULL, // mask / 2^192
0x00000000ffffffffULL, // mask / 2^192
0x00000007ffffffffULL, // mask / 2^192
0x0000003fffffffffULL, // mask / 2^192
0x000003ffffffffffULL, // mask / 2^192
0x00001fffffffffffULL, // mask / 2^192
0x0000ffffffffffffULL, // mask / 2^192
0x000fffffffffffffULL, // mask / 2^192
0x007fffffffffffffULL, // mask / 2^192
0x03ffffffffffffffULL // mask / 2^192
};
// Values of 10^(-x) trancated to Ex bits beyond the binary point, and
// in the right position to be compared with the fraction from C * kx,
// 1 <= x <= 37; the fraction consists of the low Ex bits in C * kx
// (these values are aligned with the low 128 bits of the fraction)
UINT128 ten2mxtrunc128[] = {
{{0xccccccccccccccccULL, 0xccccccccccccccccULL}},
// (ten2mx >> 128) = cccccccccccccccccccccccccccccccc
{{0x3d70a3d70a3d70a3ULL, 0xa3d70a3d70a3d70aULL}},
// (ten2mx >> 128) = a3d70a3d70a3d70a3d70a3d70a3d70a3
{{0x645a1cac083126e9ULL, 0x83126e978d4fdf3bULL}},
// (ten2mx >> 128) = 83126e978d4fdf3b645a1cac083126e9
{{0xd3c36113404ea4a8ULL, 0xd1b71758e219652bULL}},
// (ten2mx >> 128) = d1b71758e219652bd3c36113404ea4a8
{{0x0fcf80dc33721d53ULL, 0xa7c5ac471b478423ULL}},
// (ten2mx >> 128) = a7c5ac471b4784230fcf80dc33721d53
{{0xa63f9a49c2c1b10fULL, 0x8637bd05af6c69b5ULL}},
// (ten2mx >> 128) = 8637bd05af6c69b5a63f9a49c2c1b10f
{{0x3d32907604691b4cULL, 0xd6bf94d5e57a42bcULL}},
// (ten2mx >> 128) = d6bf94d5e57a42bc3d32907604691b4c
{{0xfdc20d2b36ba7c3dULL, 0xabcc77118461cefcULL}},
// (ten2mx >> 128) = abcc77118461cefcfdc20d2b36ba7c3d
{{0x31680a88f8953030ULL, 0x89705f4136b4a597ULL}},
// (ten2mx >> 128) = 89705f4136b4a59731680a88f8953030
{{0xb573440e5a884d1bULL, 0xdbe6fecebdedd5beULL}},
// (ten2mx >> 128) = dbe6fecebdedd5beb573440e5a884d1b
{{0xf78f69a51539d748ULL, 0xafebff0bcb24aafeULL}},
// (ten2mx >> 128) = afebff0bcb24aafef78f69a51539d748
{{0xf93f87b7442e45d3ULL, 0x8cbccc096f5088cbULL}},
// (ten2mx >> 128) = 8cbccc096f5088cbf93f87b7442e45d3
{{0x2865a5f206b06fb9ULL, 0xe12e13424bb40e13ULL}},
// (ten2mx >> 128) = e12e13424bb40e132865a5f206b06fb9
{{0x538484c19ef38c94ULL, 0xb424dc35095cd80fULL}},
// (ten2mx >> 128) = b424dc35095cd80f538484c19ef38c94
{{0x0f9d37014bf60a10ULL, 0x901d7cf73ab0acd9ULL}},
// (ten2mx >> 128) = 901d7cf73ab0acd90f9d37014bf60a10
{{0x4c2ebe687989a9b3ULL, 0xe69594bec44de15bULL}},
// (ten2mx >> 128) = e69594bec44de15b4c2ebe687989a9b3
{{0x09befeb9fad487c2ULL, 0xb877aa3236a4b449ULL}},
// (ten2mx >> 128) = b877aa3236a4b44909befeb9fad487c2
{{0x3aff322e62439fcfULL, 0x9392ee8e921d5d07ULL}},
// (ten2mx >> 128) = 9392ee8e921d5d073aff322e62439fcf
{{0x2b31e9e3d06c32e5ULL, 0xec1e4a7db69561a5ULL}},
// (ten2mx >> 128) = ec1e4a7db69561a52b31e9e3d06c32e5
{{0x88f4bb1ca6bcf584ULL, 0xbce5086492111aeaULL}},
// (ten2mx >> 128) = bce5086492111aea88f4bb1ca6bcf584
{{0xd3f6fc16ebca5e03ULL, 0x971da05074da7beeULL}},
// (ten2mx >> 128) = 971da05074da7beed3f6fc16ebca5e03
{{0x5324c68b12dd6338ULL, 0xf1c90080baf72cb1ULL}},
// (ten2mx >> 128) = f1c90080baf72cb15324c68b12dd6338
{{0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}},
// (ten2mx >> 128) = c16d9a0095928a2775b7053c0f178293
{{0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}},
// (ten2mx >> 128) = 9abe14cd44753b52c4926a9672793542
{{0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}},
// (ten2mx >> 128) = f79687aed3eec5513a83ddbd83f52204
{{0x95364afe032a819dULL, 0xc612062576589ddaULL}},
// (ten2mx >> 128) = c612062576589dda95364afe032a819d
{{0x775ea264cf55347dULL, 0x9e74d1b791e07e48ULL}},
// (ten2mx >> 128) = 9e74d1b791e07e48775ea264cf55347d
{{0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}},
// (ten2mx >> 128) = fd87b5f28300ca0d8bca9d6e188853fc
{{0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}},
// (ten2mx >> 128) = cad2f7f5359a3b3e096ee45813a04330
{{0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}},
// (ten2mx >> 128) = a2425ff75e14fc31a1258379a94d028d
{{0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}},
// (ten2mx >> 128) = 81ceb32c4b43fcf480eacf948770ced7
{{0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}},
// (ten2mx >> 128) = cfb11ead453994ba67de18eda5814af2
{{0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}},
// (ten2mx >> 128) = a6274bbdd0fadd61ecb1ad8aeacdd58e
{{0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}},
// (ten2mx >> 128) = 84ec3c97da624ab4bd5af13bef0b113e
{{0x955e4ec64b44e864ULL, 0xd4ad2dbfc3d07787ULL}},
// (ten2mx >> 128) = d4ad2dbfc3d07787955e4ec64b44e864
{{0xdde50bd1d5d0b9e9ULL, 0xaa242499697392d2ULL}},
// (ten2mx >> 128) = aa242499697392d2dde50bd1d5d0b9e9
{{0x7e50d64177da2e54ULL, 0x881cea14545c7575ULL}}
// (ten2mx >> 128) = 881cea14545c75757e50d64177da2e54
};
UINT192 Kx192[] = {
{{0xcccccccccccccccdULL, 0xccccccccccccccccULL,
0xccccccccccccccccULL}},
// 10^-1 ~= cccccccccccccccccccccccccccccccccccccccccccccccd * 2^-195
{{0xd70a3d70a3d70a3eULL, 0x3d70a3d70a3d70a3ULL,
0xa3d70a3d70a3d70aULL}},
// 10^-2 ~= a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3e * 2^-198
{{0x78d4fdf3b645a1cbULL, 0x645a1cac083126e9ULL,
0x83126e978d4fdf3bULL}},
// 10^-3 ~= 83126e978d4fdf3b645a1cac083126e978d4fdf3b645a1cb * 2^-201
{{0xc154c985f06f6945ULL, 0xd3c36113404ea4a8ULL,
0xd1b71758e219652bULL}},
// 10^-4 ~= d1b71758e219652bd3c36113404ea4a8c154c985f06f6945 * 2^-205
{{0xcddd6e04c0592104ULL, 0x0fcf80dc33721d53ULL,
0xa7c5ac471b478423ULL}},
// 10^-5 ~= a7c5ac471b4784230fcf80dc33721d53cddd6e04c0592104 * 2^-208
{{0xd7e45803cd141a6aULL, 0xa63f9a49c2c1b10fULL,
0x8637bd05af6c69b5ULL}},
// 10^-6 ~= 8637bd05af6c69b5a63f9a49c2c1b10fd7e45803cd141a6a * 2^-211
{{0x8ca08cd2e1b9c3dcULL, 0x3d32907604691b4cULL,
0xd6bf94d5e57a42bcULL}},
// 10^-7 ~= d6bf94d5e57a42bc3d32907604691b4c8ca08cd2e1b9c3dc * 2^-215
{{0x3d4d3d758161697dULL, 0xfdc20d2b36ba7c3dULL,
0xabcc77118461cefcULL}},
// 10^-8 ~= abcc77118461cefcfdc20d2b36ba7c3d3d4d3d758161697d * 2^-218
{{0xfdd7645e011abacaULL, 0x31680a88f8953030ULL,
0x89705f4136b4a597ULL}},
// 10^-9 ~= 89705f4136b4a59731680a88f8953030fdd7645e011abaca * 2^-221
{{0x2fbf06fcce912addULL, 0xb573440e5a884d1bULL,
0xdbe6fecebdedd5beULL}},
// 10^-10 ~= dbe6fecebdedd5beb573440e5a884d1b2fbf06fcce912add * 2^-225
{{0xf2ff38ca3eda88b1ULL, 0xf78f69a51539d748ULL,
0xafebff0bcb24aafeULL}},
// 10^-11 ~= afebff0bcb24aafef78f69a51539d748f2ff38ca3eda88b1 * 2^-228
{{0xf598fa3b657ba08eULL, 0xf93f87b7442e45d3ULL,
0x8cbccc096f5088cbULL}},
// 10^-12 ~= 8cbccc096f5088cbf93f87b7442e45d3f598fa3b657ba08e * 2^-231
{{0x88f4c3923bf900e3ULL, 0x2865a5f206b06fb9ULL,
0xe12e13424bb40e13ULL}},
// 10^-13 ~= e12e13424bb40e132865a5f206b06fb988f4c3923bf900e3 * 2^-235
{{0x6d909c74fcc733e9ULL, 0x538484c19ef38c94ULL,
0xb424dc35095cd80fULL}},
// 10^-14 ~= b424dc35095cd80f538484c19ef38c946d909c74fcc733e9 * 2^-238
{{0x57a6e390ca38f654ULL, 0x0f9d37014bf60a10ULL,
0x901d7cf73ab0acd9ULL}},
// 10^-15 ~= 901d7cf73ab0acd90f9d37014bf60a1057a6e390ca38f654 * 2^-241
{{0xbf716c1add27f086ULL, 0x4c2ebe687989a9b3ULL,
0xe69594bec44de15bULL}},
// 10^-16 ~= e69594bec44de15b4c2ebe687989a9b3bf716c1add27f086 * 2^-245
{{0xff8df0157db98d38ULL, 0x09befeb9fad487c2ULL,
0xb877aa3236a4b449ULL}},
// 10^-17 ~= b877aa3236a4b44909befeb9fad487c2ff8df0157db98d38 * 2^-248
{{0x32d7f344649470faULL, 0x3aff322e62439fcfULL,
0x9392ee8e921d5d07ULL}},
// 10^-18 ~= 9392ee8e921d5d073aff322e62439fcf32d7f344649470fa * 2^-251
{{0x1e2652070753e7f5ULL, 0x2b31e9e3d06c32e5ULL,
0xec1e4a7db69561a5ULL}},
// 10^-19 ~= ec1e4a7db69561a52b31e9e3d06c32e51e2652070753e7f5 * 2^-255
{{0x181ea8059f76532bULL, 0x88f4bb1ca6bcf584ULL,
0xbce5086492111aeaULL}},
// 10^-20 ~= bce5086492111aea88f4bb1ca6bcf584181ea8059f76532b * 2^-258
{{0x467eecd14c5ea8efULL, 0xd3f6fc16ebca5e03ULL,
0x971da05074da7beeULL}},
// 10^-21 ~= 971da05074da7beed3f6fc16ebca5e03467eecd14c5ea8ef * 2^-261
{{0x70cb148213caa7e5ULL, 0x5324c68b12dd6338ULL,
0xf1c90080baf72cb1ULL}},
// 10^-22 ~= f1c90080baf72cb15324c68b12dd633870cb148213caa7e5 * 2^-265
{{0x8d6f439b43088651ULL, 0x75b7053c0f178293ULL,
0xc16d9a0095928a27ULL}},
// 10^-23 ~= c16d9a0095928a2775b7053c0f1782938d6f439b43088651 * 2^-268
{{0xd78c3615cf3a050dULL, 0xc4926a9672793542ULL,
0x9abe14cd44753b52ULL}},
// 10^-24 ~= 9abe14cd44753b52c4926a9672793542d78c3615cf3a050d * 2^-271
{{0x8c1389bc7ec33b48ULL, 0x3a83ddbd83f52204ULL,
0xf79687aed3eec551ULL}},
// 10^-25 ~= f79687aed3eec5513a83ddbd83f522048c1389bc7ec33b48 * 2^-275
{{0x3cdc6e306568fc3aULL, 0x95364afe032a819dULL,
0xc612062576589ddaULL}},
// 10^-26 ~= c612062576589dda95364afe032a819d3cdc6e306568fc3a * 2^-278
{{0xca49f1c05120c9c8ULL, 0x775ea264cf55347dULL,
0x9e74d1b791e07e48ULL}},
// 10^-27 ~= 9e74d1b791e07e48775ea264cf55347dca49f1c05120c9c8 * 2^-281
{{0x76dcb60081ce0fa6ULL, 0x8bca9d6e188853fcULL,
0xfd87b5f28300ca0dULL}},
// 10^-28 ~= fd87b5f28300ca0d8bca9d6e188853fc76dcb60081ce0fa6 * 2^-285
{{0x5f16f80067d80c85ULL, 0x096ee45813a04330ULL,
0xcad2f7f5359a3b3eULL}},
// 10^-29 ~= cad2f7f5359a3b3e096ee45813a043305f16f80067d80c85 * 2^-288
{{0x18df2ccd1fe00a04ULL, 0xa1258379a94d028dULL,
0xa2425ff75e14fc31ULL}},
// 10^-30 ~= a2425ff75e14fc31a1258379a94d028d18df2ccd1fe00a04 * 2^-291
{{0x4718f0a419800803ULL, 0x80eacf948770ced7ULL,
0x81ceb32c4b43fcf4ULL}},
// 10^-31 ~= 81ceb32c4b43fcf480eacf948770ced74718f0a419800803 * 2^-294
{{0x0b5b1aa028ccd99fULL, 0x67de18eda5814af2ULL,
0xcfb11ead453994baULL}},
// 10^-32 ~= cfb11ead453994ba67de18eda5814af20b5b1aa028ccd99f * 2^-298
{{0x6f7c154ced70ae19ULL, 0xecb1ad8aeacdd58eULL,
0xa6274bbdd0fadd61ULL}},
// 10^-33 ~= a6274bbdd0fadd61ecb1ad8aeacdd58e6f7c154ced70ae19 * 2^-301
{{0xbf967770bdf3be7aULL, 0xbd5af13bef0b113eULL,
0x84ec3c97da624ab4ULL}},
// 10^-34 ~= 84ec3c97da624ab4bd5af13bef0b113ebf967770bdf3be7a * 2^-304
{{0x65bd8be79652ca5dULL, 0x955e4ec64b44e864ULL,
0xd4ad2dbfc3d07787ULL}},
// 10^-35 ~= d4ad2dbfc3d07787955e4ec64b44e86465bd8be79652ca5d * 2^-308
{{0xeafe098611dbd517ULL, 0xdde50bd1d5d0b9e9ULL,
0xaa242499697392d2ULL}},
// 10^-36 ~= aa242499697392d2dde50bd1d5d0b9e9eafe098611dbd517 * 2^-311
{{0xbbfe6e04db164413ULL, 0x7e50d64177da2e54ULL,
0x881cea14545c7575ULL}},
// 10^-37 ~= 881cea14545c75757e50d64177da2e54bbfe6e04db164413 * 2^-314
{{0x2cca49a15e8a0684ULL, 0x96e7bd358c904a21ULL,
0xd9c7dced53c72255ULL}},
// 10^-38 ~= d9c7dced53c7225596e7bd358c904a212cca49a15e8a0684 * 2^-318
{{0x8a3b6e1ab2080537ULL, 0xabec975e0a0d081aULL,
0xae397d8aa96c1b77ULL}},
// 10^-39 ~= ae397d8aa96c1b77abec975e0a0d081a8a3b6e1ab2080537 * 2^-321
{{0x3b62be7bc1a0042cULL, 0x2323ac4b3b3da015ULL,
0x8b61313bbabce2c6ULL}},
// 10^-40 ~= 8b61313bbabce2c62323ac4b3b3da0153b62be7bc1a0042c * 2^-324
{{0x5f0463f935ccd379ULL, 0x6b6c46dec52f6688ULL,
0xdf01e85f912e37a3ULL}},
// 10^-41 ~= df01e85f912e37a36b6c46dec52f66885f0463f935ccd379 * 2^-328
{{0x7f36b660f7d70f94ULL, 0x55f038b237591ed3ULL,
0xb267ed1940f1c61cULL}},
// 10^-42 ~= b267ed1940f1c61c55f038b237591ed37f36b660f7d70f94 * 2^-331
{{0xcc2bc51a5fdf3faaULL, 0x77f3608e92adb242ULL,
0x8eb98a7a9a5b04e3ULL}},
// 10^-43 ~= 8eb98a7a9a5b04e377f3608e92adb242cc2bc51a5fdf3faa * 2^-334
{{0xe046082a32fecc42ULL, 0x8cb89a7db77c506aULL,
0xe45c10c42a2b3b05ULL}},
// 10^-44 ~= e45c10c42a2b3b058cb89a7db77c506ae046082a32fecc42 * 2^-338
{{0x4d04d354f598a368ULL, 0x3d607b97c5fd0d22ULL,
0xb6b00d69bb55c8d1ULL}},
// 10^-45 ~= b6b00d69bb55c8d13d607b97c5fd0d224d04d354f598a368 * 2^-341
{{0x3d9d75dd9146e920ULL, 0xcab3961304ca70e8ULL,
0x9226712162ab070dULL}},
// 10^-46 ~= 9226712162ab070dcab3961304ca70e83d9d75dd9146e920 * 2^-344
{{0xc8fbefc8e8717500ULL, 0xaab8f01e6e10b4a6ULL,
0xe9d71b689dde71afULL}},
// 10^-47 ~= e9d71b689dde71afaab8f01e6e10b4a6c8fbefc8e8717500 * 2^-348
{{0x3a63263a538df734ULL, 0x5560c018580d5d52ULL,
0xbb127c53b17ec159ULL}},
// 10^-48 ~= bb127c53b17ec1595560c018580d5d523a63263a538df734 * 2^-351
{{0x2eb5b82ea93e5f5dULL, 0xdde7001379a44aa8ULL,
0x95a8637627989aadULL}},
// 10^-49 ~= 95a8637627989aaddde7001379a44aa82eb5b82ea93e5f5d * 2^-354
{{0x4abc59e441fd6561ULL, 0x963e66858f6d4440ULL,
0xef73d256a5c0f77cULL}},
// 10^-50 ~= ef73d256a5c0f77c963e66858f6d44404abc59e441fd6561 * 2^-358
{{0x6efd14b69b311de7ULL, 0xde98520472bdd033ULL,
0xbf8fdb78849a5f96ULL}},
// 10^-51 ~= bf8fdb78849a5f96de98520472bdd0336efd14b69b311de7 * 2^-361
{{0x259743c548f417ecULL, 0xe546a8038efe4029ULL,
0x993fe2c6d07b7fabULL}},
// 10^-52 ~= 993fe2c6d07b7fabe546a8038efe4029259743c548f417ec * 2^-364
{{0x3c25393ba7ecf313ULL, 0xd53dd99f4b3066a8ULL,
0xf53304714d9265dfULL}},
// 10^-53 ~= f53304714d9265dfd53dd99f4b3066a83c25393ba7ecf313 * 2^-368
{{0x96842dc95323f5a9ULL, 0xaa97e14c3c26b886ULL,
0xc428d05aa4751e4cULL}},
// 10^-54 ~= c428d05aa4751e4caa97e14c3c26b88696842dc95323f5a9 * 2^-371
{{0xab9cf16ddc1cc487ULL, 0x55464dd69685606bULL,
0x9ced737bb6c4183dULL}},
// 10^-55 ~= 9ced737bb6c4183d55464dd69685606bab9cf16ddc1cc487 * 2^-374
{{0xac2e4f162cfad40bULL, 0xeed6e2f0f0d56712ULL, 0xfb158592be068d2eULL}}
// 10^-56 ~= fb158592be068d2eeed6e2f0f0d56712ac2e4f162cfad40b * 2^-378
};
unsigned int Ex192m192[] = {
3, // 195 - 192, Ex = 195
6, // 198 - 192, Ex = 198
9, // 201 - 192, Ex = 201
13, // 205 - 192, Ex = 205
16, // 208 - 192, Ex = 208
19, // 211 - 192, Ex = 211
23, // 215 - 192, Ex = 215
26, // 218 - 192, Ex = 218
29, // 221 - 192, Ex = 221
33, // 225 - 192, Ex = 225
36, // 228 - 192, Ex = 228
39, // 231 - 192, Ex = 231
43, // 235 - 192, Ex = 235
46, // 238 - 192, Ex = 238
49, // 241 - 192, Ex = 241
53, // 245 - 192, Ex = 245
56, // 248 - 192, Ex = 248
59, // 251 - 192, Ex = 251
63, // 255 - 192, Ex = 255
2, // 258 - 256, Ex = 258
5, // 261 - 256, Ex = 261
9, // 265 - 256, Ex = 265
12, // 268 - 256, Ex = 268
15, // 271 - 256, Ex = 271
19, // 275 - 256, Ex = 275
22, // 278 - 256, Ex = 278
25, // 281 - 256, Ex = 281
29, // 285 - 256, Ex = 285
32, // 288 - 256, Ex = 288
35, // 291 - 256, Ex = 291
38, // 294 - 256, Ex = 294
42, // 298 - 256, Ex = 298
45, // 301 - 256, Ex = 301
48, // 304 - 256, Ex = 304
52, // 308 - 256, Ex = 308
55, // 311 - 256, Ex = 311
58, // 314 - 256, Ex = 314
62, // 318 - 256, Ex = 318
1, // 321 - 320, Ex = 321
4, // 324 - 320, Ex = 324
8, // 328 - 320, Ex = 328
11, // 331 - 320, Ex = 331
14, // 334 - 320, Ex = 334
18, // 338 - 320, Ex = 338
21, // 341 - 320, Ex = 341
24, // 344 - 320, Ex = 344
28, // 348 - 320, Ex = 348
31, // 351 - 320, Ex = 351
34, // 354 - 320, Ex = 354
38, // 358 - 320, Ex = 358
41, // 361 - 320, Ex = 361
44, // 364 - 320, Ex = 364
48, // 368 - 320, Ex = 368
51, // 371 - 320, Ex = 371
54, // 374 - 320, Ex = 374
58 // 378 - 320, Ex = 378
};
UINT64 half192[] = {
0x0000000000000004ULL, // half / 2^192 = 4
0x0000000000000020ULL, // half / 2^192 = 20
0x0000000000000100ULL, // half / 2^192 = 100
0x0000000000001000ULL, // half / 2^192 = 1000
0x0000000000008000ULL, // half / 2^192 = 8000
0x0000000000040000ULL, // half / 2^192 = 40000
0x0000000000400000ULL, // half / 2^192 = 400000
0x0000000002000000ULL, // half / 2^192 = 2000000
0x0000000010000000ULL, // half / 2^192 = 10000000
0x0000000100000000ULL, // half / 2^192 = 100000000
0x0000000800000000ULL, // half / 2^192 = 800000000
0x0000004000000000ULL, // half / 2^192 = 4000000000
0x0000040000000000ULL, // half / 2^192 = 40000000000
0x0000200000000000ULL, // half / 2^192 = 200000000000
0x0001000000000000ULL, // half / 2^192 = 1000000000000
0x0010000000000000ULL, // half / 2^192 = 10000000000000
0x0080000000000000ULL, // half / 2^192 = 80000000000000
0x0400000000000000ULL, // half / 2^192 = 400000000000000
0x4000000000000000ULL, // half / 2^192 = 4000000000000000
0x0000000000000002ULL, // half / 2^256 = 2
0x0000000000000010ULL, // half / 2^256 = 10
0x0000000000000100ULL, // half / 2^256 = 100
0x0000000000000800ULL, // half / 2^256 = 800
0x0000000000004000ULL, // half / 2^256 = 4000
0x0000000000040000ULL, // half / 2^256 = 40000
0x0000000000200000ULL, // half / 2^256 = 200000
0x0000000001000000ULL, // half / 2^256 = 1000000
0x0000000010000000ULL, // half / 2^256 = 10000000
0x0000000080000000ULL, // half / 2^256 = 80000000
0x0000000400000000ULL, // half / 2^256 = 400000000
0x0000002000000000ULL, // half / 2^256 = 2000000000
0x0000020000000000ULL, // half / 2^256 = 20000000000
0x0000100000000000ULL, // half / 2^256 = 100000000000
0x0000800000000000ULL, // half / 2^256 = 800000000000
0x0008000000000000ULL, // half / 2^256 = 8000000000000
0x0040000000000000ULL, // half / 2^256 = 40000000000000
0x0200000000000000ULL, // half / 2^256 = 200000000000000
0x2000000000000000ULL, // half / 2^256 = 2000000000000000
0x0000000000000001ULL, // half / 2^320 = 1
0x0000000000000008ULL, // half / 2^320 = 8
0x0000000000000080ULL, // half / 2^320 = 80
0x0000000000000400ULL, // half / 2^320 = 400
0x0000000000002000ULL, // half / 2^320 = 2000
0x0000000000020000ULL, // half / 2^320 = 20000
0x0000000000100000ULL, // half / 2^320 = 100000
0x0000000000800000ULL, // half / 2^320 = 800000
0x0000000008000000ULL, // half / 2^320 = 8000000
0x0000000040000000ULL, // half / 2^320 = 40000000
0x0000000200000000ULL, // half / 2^320 = 200000000
0x0000002000000000ULL, // half / 2^320 = 2000000000
0x0000010000000000ULL, // half / 2^320 = 10000000000
0x0000080000000000ULL, // half / 2^320 = 80000000000
0x0000800000000000ULL, // half / 2^320 = 800000000000
0x0004000000000000ULL, // half / 2^320 = 4000000000000
0x0020000000000000ULL, // half / 2^320 = 20000000000000
0x0200000000000000ULL // half / 2^320 = 200000000000000
};
UINT64 mask192[] = {
0x0000000000000007ULL, // mask / 2^192
0x000000000000003fULL, // mask / 2^192
0x00000000000001ffULL, // mask / 2^192
0x0000000000001fffULL, // mask / 2^192
0x000000000000ffffULL, // mask / 2^192
0x000000000007ffffULL, // mask / 2^192
0x00000000007fffffULL, // mask / 2^192
0x0000000003ffffffULL, // mask / 2^192
0x000000001fffffffULL, // mask / 2^192
0x00000001ffffffffULL, // mask / 2^192
0x0000000fffffffffULL, // mask / 2^192
0x0000007fffffffffULL, // mask / 2^192
0x000007ffffffffffULL, // mask / 2^192
0x00003fffffffffffULL, // mask / 2^192
0x0001ffffffffffffULL, // mask / 2^192
0x001fffffffffffffULL, // mask / 2^192
0x00ffffffffffffffULL, // mask / 2^192
0x07ffffffffffffffULL, // mask / 2^192
0x7fffffffffffffffULL, // mask / 2^192
0x0000000000000003ULL, // mask / 2^256
0x000000000000001fULL, // mask / 2^256
0x00000000000001ffULL, // mask / 2^256
0x0000000000000fffULL, // mask / 2^256
0x0000000000007fffULL, // mask / 2^256
0x000000000007ffffULL, // mask / 2^256
0x00000000003fffffULL, // mask / 2^256
0x0000000001ffffffULL, // mask / 2^256
0x000000001fffffffULL, // mask / 2^256
0x00000000ffffffffULL, // mask / 2^256
0x00000007ffffffffULL, // mask / 2^256
0x0000003fffffffffULL, // mask / 2^256
0x000003ffffffffffULL, // mask / 2^256
0x00001fffffffffffULL, // mask / 2^256
0x0000ffffffffffffULL, // mask / 2^256
0x000fffffffffffffULL, // mask / 2^256
0x007fffffffffffffULL, // mask / 2^256
0x03ffffffffffffffULL, // mask / 2^256
0x3fffffffffffffffULL, // mask / 2^256
0x0000000000000001ULL, // mask / 2^320
0x000000000000000fULL, // mask / 2^320
0x00000000000000ffULL, // mask / 2^320
0x00000000000007ffULL, // mask / 2^320
0x0000000000003fffULL, // mask / 2^320
0x000000000003ffffULL, // mask / 2^320
0x00000000001fffffULL, // mask / 2^320
0x0000000000ffffffULL, // mask / 2^320
0x000000000fffffffULL, // mask / 2^320
0x000000007fffffffULL, // mask / 2^320
0x00000003ffffffffULL, // mask / 2^320
0x0000003fffffffffULL, // mask / 2^320
0x000001ffffffffffULL, // mask / 2^320
0x00000fffffffffffULL, // mask / 2^320
0x0000ffffffffffffULL, // mask / 2^320
0x0007ffffffffffffULL, // mask / 2^320
0x003fffffffffffffULL, // mask / 2^320
0x03ffffffffffffffULL // mask / 2^320
};
UINT192 ten2mxtrunc192[] = {
{{0xccccccccccccccccULL, 0xccccccccccccccccULL,
0xccccccccccccccccULL}},
// (ten2mx >> 192) = cccccccccccccccccccccccccccccccccccccccccccccccc
{{0xd70a3d70a3d70a3dULL, 0x3d70a3d70a3d70a3ULL,
0xa3d70a3d70a3d70aULL}},
// (ten2mx >> 192) = a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d
{{0x78d4fdf3b645a1caULL, 0x645a1cac083126e9ULL,
0x83126e978d4fdf3bULL}},
// (ten2mx >> 192) = 83126e978d4fdf3b645a1cac083126e978d4fdf3b645a1ca
{{0xc154c985f06f6944ULL, 0xd3c36113404ea4a8ULL,
0xd1b71758e219652bULL}},
// (ten2mx >> 192) = d1b71758e219652bd3c36113404ea4a8c154c985f06f6944
{{0xcddd6e04c0592103ULL, 0x0fcf80dc33721d53ULL,
0xa7c5ac471b478423ULL}},
// (ten2mx >> 192) = a7c5ac471b4784230fcf80dc33721d53cddd6e04c0592103
{{0xd7e45803cd141a69ULL, 0xa63f9a49c2c1b10fULL,
0x8637bd05af6c69b5ULL}},
// (ten2mx >> 192) = 8637bd05af6c69b5a63f9a49c2c1b10fd7e45803cd141a69
{{0x8ca08cd2e1b9c3dbULL, 0x3d32907604691b4cULL,
0xd6bf94d5e57a42bcULL}},
// (ten2mx >> 192) = d6bf94d5e57a42bc3d32907604691b4c8ca08cd2e1b9c3db
{{0x3d4d3d758161697cULL, 0xfdc20d2b36ba7c3dULL,
0xabcc77118461cefcULL}},
// (ten2mx >> 192) = abcc77118461cefcfdc20d2b36ba7c3d3d4d3d758161697c
{{0xfdd7645e011abac9ULL, 0x31680a88f8953030ULL,
0x89705f4136b4a597ULL}},
// (ten2mx >> 192) = 89705f4136b4a59731680a88f8953030fdd7645e011abac9
{{0x2fbf06fcce912adcULL, 0xb573440e5a884d1bULL,
0xdbe6fecebdedd5beULL}},
// (ten2mx >> 192) = dbe6fecebdedd5beb573440e5a884d1b2fbf06fcce912adc
{{0xf2ff38ca3eda88b0ULL, 0xf78f69a51539d748ULL,
0xafebff0bcb24aafeULL}},
// (ten2mx >> 192) = afebff0bcb24aafef78f69a51539d748f2ff38ca3eda88b0
{{0xf598fa3b657ba08dULL, 0xf93f87b7442e45d3ULL,
0x8cbccc096f5088cbULL}},
// (ten2mx >> 192) = 8cbccc096f5088cbf93f87b7442e45d3f598fa3b657ba08d
{{0x88f4c3923bf900e2ULL, 0x2865a5f206b06fb9ULL,
0xe12e13424bb40e13ULL}},
// (ten2mx >> 192) = e12e13424bb40e132865a5f206b06fb988f4c3923bf900e2
{{0x6d909c74fcc733e8ULL, 0x538484c19ef38c94ULL,
0xb424dc35095cd80fULL}},
// (ten2mx >> 192) = b424dc35095cd80f538484c19ef38c946d909c74fcc733e8
{{0x57a6e390ca38f653ULL, 0x0f9d37014bf60a10ULL,
0x901d7cf73ab0acd9ULL}},
// (ten2mx >> 192) = 901d7cf73ab0acd90f9d37014bf60a1057a6e390ca38f653
{{0xbf716c1add27f085ULL, 0x4c2ebe687989a9b3ULL,
0xe69594bec44de15bULL}},
// (ten2mx >> 192) = e69594bec44de15b4c2ebe687989a9b3bf716c1add27f085
{{0xff8df0157db98d37ULL, 0x09befeb9fad487c2ULL,
0xb877aa3236a4b449ULL}},
// (ten2mx >> 192) = b877aa3236a4b44909befeb9fad487c2ff8df0157db98d37
{{0x32d7f344649470f9ULL, 0x3aff322e62439fcfULL,
0x9392ee8e921d5d07ULL}},
// (ten2mx >> 192) = 9392ee8e921d5d073aff322e62439fcf32d7f344649470f9
{{0x1e2652070753e7f4ULL, 0x2b31e9e3d06c32e5ULL,
0xec1e4a7db69561a5ULL}},
// (ten2mx >> 192) = ec1e4a7db69561a52b31e9e3d06c32e51e2652070753e7f4
{{0x181ea8059f76532aULL, 0x88f4bb1ca6bcf584ULL,
0xbce5086492111aeaULL}},
// (ten2mx >> 192) = bce5086492111aea88f4bb1ca6bcf584181ea8059f76532a
{{0x467eecd14c5ea8eeULL, 0xd3f6fc16ebca5e03ULL,
0x971da05074da7beeULL}},
// (ten2mx >> 192) = 971da05074da7beed3f6fc16ebca5e03467eecd14c5ea8ee
{{0x70cb148213caa7e4ULL, 0x5324c68b12dd6338ULL,
0xf1c90080baf72cb1ULL}},
// (ten2mx >> 192) = f1c90080baf72cb15324c68b12dd633870cb148213caa7e4
{{0x8d6f439b43088650ULL, 0x75b7053c0f178293ULL,
0xc16d9a0095928a27ULL}},
// (ten2mx >> 192) = c16d9a0095928a2775b7053c0f1782938d6f439b43088650
{{0xd78c3615cf3a050cULL, 0xc4926a9672793542ULL,
0x9abe14cd44753b52ULL}},
// (ten2mx >> 192) = 9abe14cd44753b52c4926a9672793542d78c3615cf3a050c
{{0x8c1389bc7ec33b47ULL, 0x3a83ddbd83f52204ULL,
0xf79687aed3eec551ULL}},
// (ten2mx >> 192) = f79687aed3eec5513a83ddbd83f522048c1389bc7ec33b47
{{0x3cdc6e306568fc39ULL, 0x95364afe032a819dULL,
0xc612062576589ddaULL}},
// (ten2mx >> 192) = c612062576589dda95364afe032a819d3cdc6e306568fc39
{{0xca49f1c05120c9c7ULL, 0x775ea264cf55347dULL,
0x9e74d1b791e07e48ULL}},
// (ten2mx >> 192) = 9e74d1b791e07e48775ea264cf55347dca49f1c05120c9c7
{{0x76dcb60081ce0fa5ULL, 0x8bca9d6e188853fcULL,
0xfd87b5f28300ca0dULL}},
// (ten2mx >> 192) = fd87b5f28300ca0d8bca9d6e188853fc76dcb60081ce0fa5
{{0x5f16f80067d80c84ULL, 0x096ee45813a04330ULL,
0xcad2f7f5359a3b3eULL}},
// (ten2mx >> 192) = cad2f7f5359a3b3e096ee45813a043305f16f80067d80c84
{{0x18df2ccd1fe00a03ULL, 0xa1258379a94d028dULL,
0xa2425ff75e14fc31ULL}},
// (ten2mx >> 192) = a2425ff75e14fc31a1258379a94d028d18df2ccd1fe00a03
{{0x4718f0a419800802ULL, 0x80eacf948770ced7ULL,
0x81ceb32c4b43fcf4ULL}},
// (ten2mx >> 192) = 81ceb32c4b43fcf480eacf948770ced74718f0a419800802
{{0x0b5b1aa028ccd99eULL, 0x67de18eda5814af2ULL,
0xcfb11ead453994baULL}},
// (ten2mx >> 192) = cfb11ead453994ba67de18eda5814af20b5b1aa028ccd99e
{{0x6f7c154ced70ae18ULL, 0xecb1ad8aeacdd58eULL,
0xa6274bbdd0fadd61ULL}},
// (ten2mx >> 192) = a6274bbdd0fadd61ecb1ad8aeacdd58e6f7c154ced70ae18
{{0xbf967770bdf3be79ULL, 0xbd5af13bef0b113eULL,
0x84ec3c97da624ab4ULL}},
// (ten2mx >> 192) = 84ec3c97da624ab4bd5af13bef0b113ebf967770bdf3be79
{{0x65bd8be79652ca5cULL, 0x955e4ec64b44e864ULL,
0xd4ad2dbfc3d07787ULL}},
// (ten2mx >> 192) = d4ad2dbfc3d07787955e4ec64b44e86465bd8be79652ca5c
{{0xeafe098611dbd516ULL, 0xdde50bd1d5d0b9e9ULL,
0xaa242499697392d2ULL}},
// (ten2mx >> 192) = aa242499697392d2dde50bd1d5d0b9e9eafe098611dbd516
{{0xbbfe6e04db164412ULL, 0x7e50d64177da2e54ULL,
0x881cea14545c7575ULL}},
// (ten2mx >> 192) = 881cea14545c75757e50d64177da2e54bbfe6e04db164412
{{0x2cca49a15e8a0683ULL, 0x96e7bd358c904a21ULL,
0xd9c7dced53c72255ULL}},
// (ten2mx >> 192) = d9c7dced53c7225596e7bd358c904a212cca49a15e8a0683
{{0x8a3b6e1ab2080536ULL, 0xabec975e0a0d081aULL,
0xae397d8aa96c1b77ULL}},
// (ten2mx >> 192) = ae397d8aa96c1b77abec975e0a0d081a8a3b6e1ab2080536
{{0x3b62be7bc1a0042bULL, 0x2323ac4b3b3da015ULL,
0x8b61313bbabce2c6ULL}},
// (ten2mx >> 192) = 8b61313bbabce2c62323ac4b3b3da0153b62be7bc1a0042b
{{0x5f0463f935ccd378ULL, 0x6b6c46dec52f6688ULL,
0xdf01e85f912e37a3ULL}},
// (ten2mx >> 192) = df01e85f912e37a36b6c46dec52f66885f0463f935ccd378
{{0x7f36b660f7d70f93ULL, 0x55f038b237591ed3ULL,
0xb267ed1940f1c61cULL}},
// (ten2mx >> 192) = b267ed1940f1c61c55f038b237591ed37f36b660f7d70f93
{{0xcc2bc51a5fdf3fa9ULL, 0x77f3608e92adb242ULL,
0x8eb98a7a9a5b04e3ULL}},
// (ten2mx >> 192) = 8eb98a7a9a5b04e377f3608e92adb242cc2bc51a5fdf3fa9
{{0xe046082a32fecc41ULL, 0x8cb89a7db77c506aULL,
0xe45c10c42a2b3b05ULL}},
// (ten2mx >> 192) = e45c10c42a2b3b058cb89a7db77c506ae046082a32fecc41
{{0x4d04d354f598a367ULL, 0x3d607b97c5fd0d22ULL,
0xb6b00d69bb55c8d1ULL}},
// (ten2mx >> 192) = b6b00d69bb55c8d13d607b97c5fd0d224d04d354f598a367
{{0x3d9d75dd9146e91fULL, 0xcab3961304ca70e8ULL,
0x9226712162ab070dULL}},
// (ten2mx >> 192) = 9226712162ab070dcab3961304ca70e83d9d75dd9146e91f
{{0xc8fbefc8e87174ffULL, 0xaab8f01e6e10b4a6ULL,
0xe9d71b689dde71afULL}},
// (ten2mx >> 192) = e9d71b689dde71afaab8f01e6e10b4a6c8fbefc8e87174ff
{{0x3a63263a538df733ULL, 0x5560c018580d5d52ULL,
0xbb127c53b17ec159ULL}},
// (ten2mx >> 192) = bb127c53b17ec1595560c018580d5d523a63263a538df733
{{0x2eb5b82ea93e5f5cULL, 0xdde7001379a44aa8ULL,
0x95a8637627989aadULL}},
// (ten2mx >> 192) = 95a8637627989aaddde7001379a44aa82eb5b82ea93e5f5c
{{0x4abc59e441fd6560ULL, 0x963e66858f6d4440ULL,
0xef73d256a5c0f77cULL}},
// (ten2mx >> 192) = ef73d256a5c0f77c963e66858f6d44404abc59e441fd6560
{{0x6efd14b69b311de6ULL, 0xde98520472bdd033ULL,
0xbf8fdb78849a5f96ULL}},
// (ten2mx >> 192) = bf8fdb78849a5f96de98520472bdd0336efd14b69b311de6
{{0x259743c548f417ebULL, 0xe546a8038efe4029ULL,
0x993fe2c6d07b7fabULL}},
// (ten2mx >> 192) = 993fe2c6d07b7fabe546a8038efe4029259743c548f417eb
{{0x3c25393ba7ecf312ULL, 0xd53dd99f4b3066a8ULL,
0xf53304714d9265dfULL}},
// (ten2mx >> 192) = f53304714d9265dfd53dd99f4b3066a83c25393ba7ecf312
{{0x96842dc95323f5a8ULL, 0xaa97e14c3c26b886ULL,
0xc428d05aa4751e4cULL}},
// (ten2mx >> 192) = c428d05aa4751e4caa97e14c3c26b88696842dc95323f5a8
{{0xab9cf16ddc1cc486ULL, 0x55464dd69685606bULL,
0x9ced737bb6c4183dULL}},
// (ten2mx >> 192) = 9ced737bb6c4183d55464dd69685606bab9cf16ddc1cc486
{{0xac2e4f162cfad40aULL, 0xeed6e2f0f0d56712ULL, 0xfb158592be068d2eULL}}
// (ten2mx >> 192) = fb158592be068d2eeed6e2f0f0d56712ac2e4f162cfad40a
};
UINT256 Kx256[] = {
{{0xcccccccccccccccdULL, 0xccccccccccccccccULL,
0xccccccccccccccccULL, 0xccccccccccccccccULL}},
// 10^-1 ~= cccccccccccccccc cccccccccccccccc
// cccccccccccccccccccccccccccccccd * 2^-259
{{0x70a3d70a3d70a3d8ULL, 0xd70a3d70a3d70a3dULL,
0x3d70a3d70a3d70a3ULL, 0xa3d70a3d70a3d70aULL}},
// 10^-2 ~= a3d70a3d70a3d70a 3d70a3d70a3d70a3
// d70a3d70a3d70a3d70a3d70a3d70a3d8 * 2^-262
{{0xc083126e978d4fe0ULL, 0x78d4fdf3b645a1caULL,
0x645a1cac083126e9ULL, 0x83126e978d4fdf3bULL}},
// 10^-3 ~= 83126e978d4fdf3b 645a1cac083126e9
// 78d4fdf3b645a1cac083126e978d4fe0 * 2^-265
{{0x67381d7dbf487fccULL, 0xc154c985f06f6944ULL,
0xd3c36113404ea4a8ULL, 0xd1b71758e219652bULL}},
// 10^-4 ~= d1b71758e219652b d3c36113404ea4a8
// c154c985f06f694467381d7dbf487fcc * 2^-269
{{0x85c67dfe32a0663dULL, 0xcddd6e04c0592103ULL,
0x0fcf80dc33721d53ULL, 0xa7c5ac471b478423ULL}},
// 10^-5 ~= a7c5ac471b478423 fcf80dc33721d53
// cddd6e04c059210385c67dfe32a0663d * 2^-272
{{0x37d1fe64f54d1e97ULL, 0xd7e45803cd141a69ULL,
0xa63f9a49c2c1b10fULL, 0x8637bd05af6c69b5ULL}},
// 10^-6 ~= 8637bd05af6c69b5 a63f9a49c2c1b10f
// d7e45803cd141a6937d1fe64f54d1e97 * 2^-275
{{0x8c8330a1887b6425ULL, 0x8ca08cd2e1b9c3dbULL,
0x3d32907604691b4cULL, 0xd6bf94d5e57a42bcULL}},
// 10^-7 ~= d6bf94d5e57a42bc 3d32907604691b4c
// 8ca08cd2e1b9c3db8c8330a1887b6425 * 2^-279
{{0x7068f3b46d2f8351ULL, 0x3d4d3d758161697cULL,
0xfdc20d2b36ba7c3dULL, 0xabcc77118461cefcULL}},
// 10^-8 ~= abcc77118461cefc fdc20d2b36ba7c3d
// 3d4d3d758161697c7068f3b46d2f8351 * 2^-282
{{0xf387295d242602a7ULL, 0xfdd7645e011abac9ULL,
0x31680a88f8953030ULL, 0x89705f4136b4a597ULL}},
// 10^-9 ~= 89705f4136b4a597 31680a88f8953030
// fdd7645e011abac9f387295d242602a7 * 2^-285
{{0xb8d8422ea03cd10bULL, 0x2fbf06fcce912adcULL,
0xb573440e5a884d1bULL, 0xdbe6fecebdedd5beULL}},
// 10^-10 ~= dbe6fecebdedd5be b573440e5a884d1b
// 2fbf06fcce912adcb8d8422ea03cd10b * 2^-289
{{0x93e034f219ca40d6ULL, 0xf2ff38ca3eda88b0ULL,
0xf78f69a51539d748ULL, 0xafebff0bcb24aafeULL}},
// 10^-11 ~= afebff0bcb24aafe f78f69a51539d748
// f2ff38ca3eda88b093e034f219ca40d6 * 2^-292
{{0x4319c3f4e16e9a45ULL, 0xf598fa3b657ba08dULL,
0xf93f87b7442e45d3ULL, 0x8cbccc096f5088cbULL}},
// 10^-12 ~= 8cbccc096f5088cb f93f87b7442e45d3
// f598fa3b657ba08d4319c3f4e16e9a45 * 2^-295
{{0x04f606549be42a07ULL, 0x88f4c3923bf900e2ULL,
0x2865a5f206b06fb9ULL, 0xe12e13424bb40e13ULL}},
// 10^-13 ~= e12e13424bb40e13 2865a5f206b06fb9
// 88f4c3923bf900e204f606549be42a07 * 2^-299
{{0x03f805107cb68806ULL, 0x6d909c74fcc733e8ULL,
0x538484c19ef38c94ULL, 0xb424dc35095cd80fULL}},
// 10^-14 ~= b424dc35095cd80f 538484c19ef38c94
// 6d909c74fcc733e803f805107cb68806 * 2^-302
{{0x3660040d3092066bULL, 0x57a6e390ca38f653ULL,
0x0f9d37014bf60a10ULL, 0x901d7cf73ab0acd9ULL}},
// 10^-15 ~= 901d7cf73ab0acd9 f9d37014bf60a10
// 57a6e390ca38f6533660040d3092066b * 2^-305
{{0x23ccd3484db670abULL, 0xbf716c1add27f085ULL,
0x4c2ebe687989a9b3ULL, 0xe69594bec44de15bULL}},
// 10^-16 ~= e69594bec44de15b 4c2ebe687989a9b3
// bf716c1add27f08523ccd3484db670ab * 2^-309
{{0x4fd70f6d0af85a23ULL, 0xff8df0157db98d37ULL,
0x09befeb9fad487c2ULL, 0xb877aa3236a4b449ULL}},
// 10^-17 ~= b877aa3236a4b449 9befeb9fad487c2
// ff8df0157db98d374fd70f6d0af85a23 * 2^-312
{{0x0cac0c573bf9e1b6ULL, 0x32d7f344649470f9ULL,
0x3aff322e62439fcfULL, 0x9392ee8e921d5d07ULL}},
// 10^-18 ~= 9392ee8e921d5d07 3aff322e62439fcf
// 32d7f344649470f90cac0c573bf9e1b6 * 2^-315
{{0xe11346f1f98fcf89ULL, 0x1e2652070753e7f4ULL,
0x2b31e9e3d06c32e5ULL, 0xec1e4a7db69561a5ULL}},
// 10^-19 ~= ec1e4a7db69561a5 2b31e9e3d06c32e5
// 1e2652070753e7f4e11346f1f98fcf89 * 2^-319
{{0x4da9058e613fd93aULL, 0x181ea8059f76532aULL,
0x88f4bb1ca6bcf584ULL, 0xbce5086492111aeaULL}},
// 10^-20 ~= bce5086492111aea 88f4bb1ca6bcf584
// 181ea8059f76532a4da9058e613fd93a * 2^-322
{{0xa48737a51a997a95ULL, 0x467eecd14c5ea8eeULL,
0xd3f6fc16ebca5e03ULL, 0x971da05074da7beeULL}},
// 10^-21 ~= 971da05074da7bee d3f6fc16ebca5e03
// 467eecd14c5ea8eea48737a51a997a95 * 2^-325
{{0x3a71f2a1c428c421ULL, 0x70cb148213caa7e4ULL,
0x5324c68b12dd6338ULL, 0xf1c90080baf72cb1ULL}},
// 10^-22 ~= f1c90080baf72cb1 5324c68b12dd6338
// 70cb148213caa7e43a71f2a1c428c421 * 2^-329
{{0x2ec18ee7d0209ce8ULL, 0x8d6f439b43088650ULL,
0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}},
// 10^-23 ~= c16d9a0095928a27 75b7053c0f178293
// 8d6f439b430886502ec18ee7d0209ce8 * 2^-332
{{0xf23472530ce6e3edULL, 0xd78c3615cf3a050cULL,
0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}},
// 10^-24 ~= 9abe14cd44753b52 c4926a9672793542
// d78c3615cf3a050cf23472530ce6e3ed * 2^-335
{{0xe9ed83b814a49fe1ULL, 0x8c1389bc7ec33b47ULL,
0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}},
// 10^-25 ~= f79687aed3eec551 3a83ddbd83f52204
// 8c1389bc7ec33b47e9ed83b814a49fe1 * 2^-339
{{0x87f1362cdd507fe7ULL, 0x3cdc6e306568fc39ULL,
0x95364afe032a819dULL, 0xc612062576589ddaULL}},
// 10^-26 ~= c612062576589dda 95364afe032a819d
// 3cdc6e306568fc3987f1362cdd507fe7 * 2^-342
{{0x9ff42b5717739986ULL, 0xca49f1c05120c9c7ULL,
0x775ea264cf55347dULL, 0x9e74d1b791e07e48ULL}},
// 10^-27 ~= 9e74d1b791e07e48 775ea264cf55347d
// ca49f1c05120c9c79ff42b5717739986 * 2^-345
{{0xccb9def1bf1f5c09ULL, 0x76dcb60081ce0fa5ULL,
0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}},
// 10^-28 ~= fd87b5f28300ca0d 8bca9d6e188853fc
// 76dcb60081ce0fa5ccb9def1bf1f5c09 * 2^-349
{{0xa3c7e58e327f7cd4ULL, 0x5f16f80067d80c84ULL,
0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}},
// 10^-29 ~= cad2f7f5359a3b3e 96ee45813a04330
// 5f16f80067d80c84a3c7e58e327f7cd4 * 2^-352
{{0xb6398471c1ff9710ULL, 0x18df2ccd1fe00a03ULL,
0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}},
// 10^-30 ~= a2425ff75e14fc31 a1258379a94d028d
// 18df2ccd1fe00a03b6398471c1ff9710 * 2^-355
{{0xf82e038e34cc78daULL, 0x4718f0a419800802ULL,
0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}},
// 10^-31 ~= 81ceb32c4b43fcf4 80eacf948770ced7
// 4718f0a419800802f82e038e34cc78da * 2^-358
{{0x59e338e387ad8e29ULL, 0x0b5b1aa028ccd99eULL,
0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}},
// 10^-32 ~= cfb11ead453994ba 67de18eda5814af2
// b5b1aa028ccd99e59e338e387ad8e29 * 2^-362
{{0x47e8fa4f9fbe0b54ULL, 0x6f7c154ced70ae18ULL,
0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}},
// 10^-33 ~= a6274bbdd0fadd61 ecb1ad8aeacdd58e
// 6f7c154ced70ae1847e8fa4f9fbe0b54 * 2^-365
{{0xd320c83fb2fe6f76ULL, 0xbf967770bdf3be79ULL,
0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}},
// 10^-34 ~= 84ec3c97da624ab4 bd5af13bef0b113e
// bf967770bdf3be79d320c83fb2fe6f76 * 2^-368
{{0x85014065eb30b257ULL, 0x65bd8be79652ca5cULL,
0x955e4ec64b44e864ULL, 0xd4ad2dbfc3d07787ULL}},
// 10^-35 ~= d4ad2dbfc3d07787 955e4ec64b44e864
// 65bd8be79652ca5c85014065eb30b257 * 2^-372
{{0xd0cdcd1e55c08eacULL, 0xeafe098611dbd516ULL,
0xdde50bd1d5d0b9e9ULL, 0xaa242499697392d2ULL}},
// 10^-36 ~= aa242499697392d2 dde50bd1d5d0b9e9
// eafe098611dbd516d0cdcd1e55c08eac * 2^-375
{{0x40a4a418449a0bbdULL, 0xbbfe6e04db164412ULL,
0x7e50d64177da2e54ULL, 0x881cea14545c7575ULL}},
// 10^-37 ~= 881cea14545c7575 7e50d64177da2e54
// bbfe6e04db16441240a4a418449a0bbd * 2^-378
{{0x9aa1068d3a9012c8ULL, 0x2cca49a15e8a0683ULL,
0x96e7bd358c904a21ULL, 0xd9c7dced53c72255ULL}},
// 10^-38 ~= d9c7dced53c72255 96e7bd358c904a21
// 2cca49a15e8a06839aa1068d3a9012c8 * 2^-382
{{0x154d9ed7620cdbd3ULL, 0x8a3b6e1ab2080536ULL,
0xabec975e0a0d081aULL, 0xae397d8aa96c1b77ULL}},
// 10^-39 ~= ae397d8aa96c1b77 abec975e0a0d081a
// 8a3b6e1ab2080536154d9ed7620cdbd3 * 2^-385
{{0x443e18ac4e70afdcULL, 0x3b62be7bc1a0042bULL,
0x2323ac4b3b3da015ULL, 0x8b61313bbabce2c6ULL}},
// 10^-40 ~= 8b61313bbabce2c6 2323ac4b3b3da015
// 3b62be7bc1a0042b443e18ac4e70afdc * 2^-388
{{0x6d30277a171ab2f9ULL, 0x5f0463f935ccd378ULL,
0x6b6c46dec52f6688ULL, 0xdf01e85f912e37a3ULL}},
// 10^-41 ~= df01e85f912e37a3 6b6c46dec52f6688
// 5f0463f935ccd3786d30277a171ab2f9 * 2^-392
{{0x8a8cec61ac155bfbULL, 0x7f36b660f7d70f93ULL,
0x55f038b237591ed3ULL, 0xb267ed1940f1c61cULL}},
// 10^-42 ~= b267ed1940f1c61c 55f038b237591ed3
// 7f36b660f7d70f938a8cec61ac155bfb * 2^-395
{{0x3ba3f04e23444996ULL, 0xcc2bc51a5fdf3fa9ULL,
0x77f3608e92adb242ULL, 0x8eb98a7a9a5b04e3ULL}},
// 10^-43 ~= 8eb98a7a9a5b04e3 77f3608e92adb242
// cc2bc51a5fdf3fa93ba3f04e23444996 * 2^-398
{{0xf9064d49d206dc22ULL, 0xe046082a32fecc41ULL,
0x8cb89a7db77c506aULL, 0xe45c10c42a2b3b05ULL}},
// 10^-44 ~= e45c10c42a2b3b05 8cb89a7db77c506a
// e046082a32fecc41f9064d49d206dc22 * 2^-402
{{0xfa6b7107db38b01bULL, 0x4d04d354f598a367ULL,
0x3d607b97c5fd0d22ULL, 0xb6b00d69bb55c8d1ULL}},
// 10^-45 ~= b6b00d69bb55c8d1 3d607b97c5fd0d22
// 4d04d354f598a367fa6b7107db38b01b * 2^-405
{{0xfb8927397c2d59b0ULL, 0x3d9d75dd9146e91fULL,
0xcab3961304ca70e8ULL, 0x9226712162ab070dULL}},
// 10^-46 ~= 9226712162ab070d cab3961304ca70e8
// 3d9d75dd9146e91ffb8927397c2d59b0 * 2^-408
{{0xf8db71f5937bc2b2ULL, 0xc8fbefc8e87174ffULL,
0xaab8f01e6e10b4a6ULL, 0xe9d71b689dde71afULL}},
// 10^-47 ~= e9d71b689dde71af aab8f01e6e10b4a6
// c8fbefc8e87174fff8db71f5937bc2b2 * 2^-412
{{0x2d7c5b2adc630228ULL, 0x3a63263a538df733ULL,
0x5560c018580d5d52ULL, 0xbb127c53b17ec159ULL}},
// 10^-48 ~= bb127c53b17ec159 5560c018580d5d52
// 3a63263a538df7332d7c5b2adc630228 * 2^-415
{{0x24637c2249e8ce87ULL, 0x2eb5b82ea93e5f5cULL,
0xdde7001379a44aa8ULL, 0x95a8637627989aadULL}},
// 10^-49 ~= 95a8637627989aad dde7001379a44aa8
// 2eb5b82ea93e5f5c24637c2249e8ce87 * 2^-418
{{0x3a38c69d430e173eULL, 0x4abc59e441fd6560ULL,
0x963e66858f6d4440ULL, 0xef73d256a5c0f77cULL}},
// 10^-50 ~= ef73d256a5c0f77c 963e66858f6d4440
// 4abc59e441fd65603a38c69d430e173e * 2^-422
{{0x94fa387dcf3e78feULL, 0x6efd14b69b311de6ULL,
0xde98520472bdd033ULL, 0xbf8fdb78849a5f96ULL}},
// 10^-51 ~= bf8fdb78849a5f96 de98520472bdd033
// 6efd14b69b311de694fa387dcf3e78fe * 2^-425
{{0xaa61c6cb0c31fa65ULL, 0x259743c548f417ebULL,
0xe546a8038efe4029ULL, 0x993fe2c6d07b7fabULL}},
// 10^-52 ~= 993fe2c6d07b7fab e546a8038efe4029
// 259743c548f417ebaa61c6cb0c31fa65 * 2^-428
{{0xaa360ade79e990a2ULL, 0x3c25393ba7ecf312ULL,
0xd53dd99f4b3066a8ULL, 0xf53304714d9265dfULL}},
// 10^-53 ~= f53304714d9265df d53dd99f4b3066a8
// 3c25393ba7ecf312aa360ade79e990a2 * 2^-432
{{0x882b3be52e5473b5ULL, 0x96842dc95323f5a8ULL,
0xaa97e14c3c26b886ULL, 0xc428d05aa4751e4cULL}},
// 10^-54 ~= c428d05aa4751e4c aa97e14c3c26b886
// 96842dc95323f5a8882b3be52e5473b5 * 2^-435
{{0xd355c98425105c91ULL, 0xab9cf16ddc1cc486ULL,
0x55464dd69685606bULL, 0x9ced737bb6c4183dULL}},
// 10^-55 ~= 9ced737bb6c4183d 55464dd69685606b
// ab9cf16ddc1cc486d355c98425105c91 * 2^-438
{{0xebbc75a03b4d60e7ULL, 0xac2e4f162cfad40aULL,
0xeed6e2f0f0d56712ULL, 0xfb158592be068d2eULL}},
// 10^-56 ~= fb158592be068d2e eed6e2f0f0d56712
// ac2e4f162cfad40aebbc75a03b4d60e7 * 2^-442
{{0x8963914cfc3de71fULL, 0x568b727823fbdcd5ULL,
0xf245825a5a445275ULL, 0xc8de047564d20a8bULL}},
// 10^-57 ~= c8de047564d20a8b f245825a5a445275
// 568b727823fbdcd58963914cfc3de71f * 2^-445
{{0xd44fa770c9cb1f4cULL, 0x453c5b934ffcb0aaULL,
0x5b6aceaeae9d0ec4ULL, 0xa0b19d2ab70e6ed6ULL}},
// 10^-58 ~= a0b19d2ab70e6ed6 5b6aceaeae9d0ec4
// 453c5b934ffcb0aad44fa770c9cb1f4c * 2^-448
{{0xdd0c85f3d4a27f70ULL, 0x37637c75d996f3bbULL,
0xe2bbd88bbee40bd0ULL, 0x808e17555f3ebf11ULL}},
// 10^-59 ~= 808e17555f3ebf11 e2bbd88bbee40bd0
// 37637c75d996f3bbdd0c85f3d4a27f70 * 2^-451
{{0x61ada31fba9d98b3ULL, 0x256bfa5628f185f9ULL,
0x3792f412cb06794dULL, 0xcdb02555653131b6ULL}},
// 10^-60 ~= cdb02555653131b6 3792f412cb06794d
// 256bfa5628f185f961ada31fba9d98b3 * 2^-455
{{0xe7be1c196217ad5cULL, 0x51232eab53f46b2dULL,
0x5fa8c3423c052dd7ULL, 0xa48ceaaab75a8e2bULL}},
// 10^-61 ~= a48ceaaab75a8e2b 5fa8c3423c052dd7
// 51232eab53f46b2de7be1c196217ad5c * 2^-458
{{0x52fe7ce11b46244aULL, 0x40e8f222a99055beULL,
0x1953cf68300424acULL, 0x83a3eeeef9153e89ULL}},
// 10^-62 ~= 83a3eeeef9153e89 1953cf68300424ac
// 40e8f222a99055be52fe7ce11b46244a * 2^-461
{{0x51972e34f8703a10ULL, 0x34a7e9d10f4d55fdULL,
0x8eec7f0d19a03aadULL, 0xd29fe4b18e88640eULL}},
// 10^-63 ~= d29fe4b18e88640e 8eec7f0d19a03aad
// 34a7e9d10f4d55fd51972e34f8703a10 * 2^-465
{{0x0e128b5d938cfb40ULL, 0x2a1fee40d90aab31ULL,
0x3f2398d747b36224ULL, 0xa87fea27a539e9a5ULL}},
// 10^-64 ~= a87fea27a539e9a5 3f2398d747b36224
// 2a1fee40d90aab310e128b5d938cfb40 * 2^-468
{{0x3e753c4adc70c900ULL, 0xbb4cbe9a473bbc27ULL,
0x98e947129fc2b4e9ULL, 0x86ccbb52ea94baeaULL}},
// 10^-65 ~= 86ccbb52ea94baea 98e947129fc2b4e9
// bb4cbe9a473bbc273e753c4adc70c900 * 2^-471
{{0x30bb93aafa4e0e66ULL, 0x9214642a0b92c6a5ULL,
0x5b0ed81dcc6abb0fULL, 0xd7adf884aa879177ULL}},
// 10^-66 ~= d7adf884aa879177 5b0ed81dcc6abb0f
// 9214642a0b92c6a530bb93aafa4e0e66 * 2^-475
{{0xc0960fbbfb71a51fULL, 0xa8105021a2dbd21dULL,
0xe272467e3d222f3fULL, 0xac8b2d36eed2dac5ULL}},
// 10^-67 ~= ac8b2d36eed2dac5 e272467e3d222f3f
// a8105021a2dbd21dc0960fbbfb71a51f * 2^-478
{{0x66de72fcc927b74cULL, 0xb9a6a6814f1641b1ULL,
0x1b8e9ecb641b58ffULL, 0x8a08f0f8bf0f156bULL}},
// 10^-68 ~= 8a08f0f8bf0f156b 1b8e9ecb641b58ff
// b9a6a6814f1641b166de72fcc927b74c * 2^-481
{{0xd7ca5194750c5879ULL, 0xf5d770cee4f0691bULL,
0xf8e431456cf88e65ULL, 0xdcdb1b2798182244ULL}},
// 10^-69 ~= dcdb1b2798182244 f8e431456cf88e65
// f5d770cee4f0691bd7ca5194750c5879 * 2^-485
{{0xdfd50e105da379faULL, 0x9179270bea59edafULL,
0x2d835a9df0c6d851ULL, 0xb0af48ec79ace837ULL}},
// 10^-70 ~= b0af48ec79ace837 2d835a9df0c6d851
// 9179270bea59edafdfd50e105da379fa * 2^-488
{{0x19773e737e1c6195ULL, 0x0dfa85a321e18af3ULL,
0x579c487e5a38ad0eULL, 0x8d590723948a535fULL}},
// 10^-71 ~= 8d590723948a535f 579c487e5a38ad0e
// dfa85a321e18af319773e737e1c6195 * 2^-491
{{0xf58b971f302d68efULL, 0x165da29e9c9c1184ULL,
0x25c6da63c38de1b0ULL, 0xe2280b6c20dd5232ULL}},
// 10^-72 ~= e2280b6c20dd5232 25c6da63c38de1b0
// 165da29e9c9c1184f58b971f302d68ef * 2^-495
{{0xc46fac18f3578725ULL, 0x4517b54bb07cdad0ULL,
0x1e38aeb6360b1af3ULL, 0xb4ecd5f01a4aa828ULL}},
// 10^-73 ~= b4ecd5f01a4aa828 1e38aeb6360b1af3
// 4517b54bb07cdad0c46fac18f3578725 * 2^-498
{{0x36bfbce0c2ac6c1eULL, 0x9dac910959fd7bdaULL,
0xb1c6f22b5e6f48c2ULL, 0x90bd77f3483bb9b9ULL}},
// 10^-74 ~= 90bd77f3483bb9b9 b1c6f22b5e6f48c2
// 9dac910959fd7bda36bfbce0c2ac6c1e * 2^-501
{{0x2465fb01377a4696ULL, 0x2f7a81a88ffbf95dULL,
0xb60b1d1230b20e04ULL, 0xe7958cb87392c2c2ULL}}
// 10^-75 ~= e7958cb87392c2c2 b60b1d1230b20e04
// 2f7a81a88ffbf95d2465fb01377a4696 * 2^-505
};
unsigned int Ex256m256[] = {
3, // 259 - 256, Ex = 259
6, // 262 - 256, Ex = 262
9, // 265 - 256, Ex = 265
13, // 269 - 256, Ex = 269
16, // 272 - 256, Ex = 272
19, // 275 - 256, Ex = 275
23, // 279 - 256, Ex = 279
26, // 282 - 256, Ex = 282
29, // 285 - 256, Ex = 285
33, // 289 - 256, Ex = 289
36, // 292 - 256, Ex = 292
39, // 295 - 256, Ex = 295
43, // 299 - 256, Ex = 299
46, // 302 - 256, Ex = 302
49, // 305 - 256, Ex = 305
53, // 309 - 256, Ex = 309
56, // 312 - 256, Ex = 312
59, // 315 - 256, Ex = 315
63, // 319 - 256, Ex = 319
2, // 322 - 320, Ex = 322
5, // 325 - 320, Ex = 325
9, // 329 - 320, Ex = 329
12, // 332 - 320, Ex = 332
15, // 335 - 320, Ex = 335
19, // 339 - 320, Ex = 339
22, // 342 - 320, Ex = 342
25, // 345 - 320, Ex = 345
29, // 349 - 320, Ex = 349
32, // 352 - 320, Ex = 352
35, // 355 - 320, Ex = 355
38, // 358 - 320, Ex = 358
42, // 362 - 320, Ex = 362
45, // 365 - 320, Ex = 365
48, // 368 - 320, Ex = 368
52, // 372 - 320, Ex = 372
55, // 375 - 320, Ex = 375
58, // 378 - 320, Ex = 378
62, // 382 - 320, Ex = 382
1, // 385 - 384, Ex = 385
4, // 388 - 384, Ex = 388
8, // 392 - 384, Ex = 392
11, // 395 - 384, Ex = 395
14, // 398 - 384, Ex = 398
18, // 402 - 384, Ex = 402
21, // 405 - 384, Ex = 405
24, // 408 - 384, Ex = 408
28, // 412 - 384, Ex = 412
31, // 415 - 384, Ex = 415
34, // 418 - 384, Ex = 418
38, // 422 - 384, Ex = 422
41, // 425 - 384, Ex = 425
44, // 428 - 384, Ex = 428
48, // 432 - 384, Ex = 432
51, // 435 - 384, Ex = 435
54, // 438 - 384, Ex = 438
58, // 442 - 384, Ex = 442
61, // 445 - 384, Ex = 445
0, // 448 - 448, Ex = 448
3, // 451 - 448, Ex = 451
7, // 455 - 448, Ex = 455
10, // 458 - 448, Ex = 458
13, // 461 - 448, Ex = 461
17, // 465 - 448, Ex = 465
20, // 468 - 448, Ex = 468
23, // 471 - 448, Ex = 471
27, // 475 - 448, Ex = 475
30, // 478 - 448, Ex = 478
33, // 481 - 448, Ex = 481
37, // 485 - 448, Ex = 485
40, // 488 - 448, Ex = 488
43, // 491 - 448, Ex = 491
47, // 495 - 448, Ex = 495
50, // 498 - 448, Ex = 498
53, // 501 - 448, Ex = 501
57 // 505 - 448, Ex = 505
};
UINT64 half256[] = {
0x0000000000000004ULL, // half / 2^256 = 4
0x0000000000000020ULL, // half / 2^256 = 20
0x0000000000000100ULL, // half / 2^256 = 100
0x0000000000001000ULL, // half / 2^256 = 1000
0x0000000000008000ULL, // half / 2^256 = 8000
0x0000000000040000ULL, // half / 2^256 = 40000
0x0000000000400000ULL, // half / 2^256 = 400000
0x0000000002000000ULL, // half / 2^256 = 2000000
0x0000000010000000ULL, // half / 2^256 = 10000000
0x0000000100000000ULL, // half / 2^256 = 100000000
0x0000000800000000ULL, // half / 2^256 = 800000000
0x0000004000000000ULL, // half / 2^256 = 4000000000
0x0000040000000000ULL, // half / 2^256 = 40000000000
0x0000200000000000ULL, // half / 2^256 = 200000000000
0x0001000000000000ULL, // half / 2^256 = 1000000000000
0x0010000000000000ULL, // half / 2^256 = 10000000000000
0x0080000000000000ULL, // half / 2^256 = 80000000000000
0x0400000000000000ULL, // half / 2^256 = 400000000000000
0x4000000000000000ULL, // half / 2^256 = 4000000000000000
0x0000000000000002ULL, // half / 2^320 = 2
0x0000000000000010ULL, // half / 2^320 = 10
0x0000000000000100ULL, // half / 2^320 = 100
0x0000000000000800ULL, // half / 2^320 = 800
0x0000000000004000ULL, // half / 2^320 = 4000
0x0000000000040000ULL, // half / 2^320 = 40000
0x0000000000200000ULL, // half / 2^320 = 200000
0x0000000001000000ULL, // half / 2^320 = 1000000
0x0000000010000000ULL, // half / 2^320 = 10000000
0x0000000080000000ULL, // half / 2^320 = 80000000
0x0000000400000000ULL, // half / 2^320 = 400000000
0x0000002000000000ULL, // half / 2^320 = 2000000000
0x0000020000000000ULL, // half / 2^320 = 20000000000
0x0000100000000000ULL, // half / 2^320 = 100000000000
0x0000800000000000ULL, // half / 2^320 = 800000000000
0x0008000000000000ULL, // half / 2^320 = 8000000000000
0x0040000000000000ULL, // half / 2^320 = 40000000000000
0x0200000000000000ULL, // half / 2^320 = 200000000000000
0x2000000000000000ULL, // half / 2^320 = 2000000000000000
0x0000000000000001ULL, // half / 2^384 = 1
0x0000000000000008ULL, // half / 2^384 = 8
0x0000000000000080ULL, // half / 2^384 = 80
0x0000000000000400ULL, // half / 2^384 = 400
0x0000000000002000ULL, // half / 2^384 = 2000
0x0000000000020000ULL, // half / 2^384 = 20000
0x0000000000100000ULL, // half / 2^384 = 100000
0x0000000000800000ULL, // half / 2^384 = 800000
0x0000000008000000ULL, // half / 2^384 = 8000000
0x0000000040000000ULL, // half / 2^384 = 40000000
0x0000000200000000ULL, // half / 2^384 = 200000000
0x0000002000000000ULL, // half / 2^384 = 2000000000
0x0000010000000000ULL, // half / 2^384 = 10000000000
0x0000080000000000ULL, // half / 2^384 = 80000000000
0x0000800000000000ULL, // half / 2^384 = 800000000000
0x0004000000000000ULL, // half / 2^384 = 4000000000000
0x0020000000000000ULL, // half / 2^384 = 20000000000000
0x0200000000000000ULL, // half / 2^384 = 200000000000000
0x1000000000000000ULL, // half / 2^384 = 1000000000000000
0x8000000000000000ULL, // half / 2^384 = 8000000000000000
0x0000000000000004ULL, // half / 2^448 = 4
0x0000000000000040ULL, // half / 2^448 = 40
0x0000000000000200ULL, // half / 2^448 = 200
0x0000000000001000ULL, // half / 2^448 = 1000
0x0000000000010000ULL, // half / 2^448 = 10000
0x0000000000080000ULL, // half / 2^448 = 80000
0x0000000000400000ULL, // half / 2^448 = 400000
0x0000000004000000ULL, // half / 2^448 = 4000000
0x0000000020000000ULL, // half / 2^448 = 20000000
0x0000000100000000ULL, // half / 2^448 = 100000000
0x0000001000000000ULL, // half / 2^448 = 1000000000
0x0000008000000000ULL, // half / 2^448 = 8000000000
0x0000040000000000ULL, // half / 2^448 = 40000000000
0x0000400000000000ULL, // half / 2^448 = 400000000000
0x0002000000000000ULL, // half / 2^448 = 2000000000000
0x0010000000000000ULL, // half / 2^448 = 10000000000000
0x0100000000000000ULL // half / 2^448 = 100000000000000
};
UINT64 mask256[] = {
0x0000000000000007ULL, // mask / 2^256
0x000000000000003fULL, // mask / 2^256
0x00000000000001ffULL, // mask / 2^256
0x0000000000001fffULL, // mask / 2^256
0x000000000000ffffULL, // mask / 2^256
0x000000000007ffffULL, // mask / 2^256
0x00000000007fffffULL, // mask / 2^256
0x0000000003ffffffULL, // mask / 2^256
0x000000001fffffffULL, // mask / 2^256
0x00000001ffffffffULL, // mask / 2^256
0x0000000fffffffffULL, // mask / 2^256
0x0000007fffffffffULL, // mask / 2^256
0x000007ffffffffffULL, // mask / 2^256
0x00003fffffffffffULL, // mask / 2^256
0x0001ffffffffffffULL, // mask / 2^256
0x001fffffffffffffULL, // mask / 2^256
0x00ffffffffffffffULL, // mask / 2^256
0x07ffffffffffffffULL, // mask / 2^256
0x7fffffffffffffffULL, // mask / 2^256
0x0000000000000003ULL, // mask / 2^320
0x000000000000001fULL, // mask / 2^320
0x00000000000001ffULL, // mask / 2^320
0x0000000000000fffULL, // mask / 2^320
0x0000000000007fffULL, // mask / 2^320
0x000000000007ffffULL, // mask / 2^320
0x00000000003fffffULL, // mask / 2^320
0x0000000001ffffffULL, // mask / 2^320
0x000000001fffffffULL, // mask / 2^320
0x00000000ffffffffULL, // mask / 2^320
0x00000007ffffffffULL, // mask / 2^320
0x0000003fffffffffULL, // mask / 2^320
0x000003ffffffffffULL, // mask / 2^320
0x00001fffffffffffULL, // mask / 2^320
0x0000ffffffffffffULL, // mask / 2^320
0x000fffffffffffffULL, // mask / 2^320
0x007fffffffffffffULL, // mask / 2^320
0x03ffffffffffffffULL, // mask / 2^320
0x3fffffffffffffffULL, // mask / 2^320
0x0000000000000001ULL, // mask / 2^384
0x000000000000000fULL, // mask / 2^384
0x00000000000000ffULL, // mask / 2^384
0x00000000000007ffULL, // mask / 2^384
0x0000000000003fffULL, // mask / 2^384
0x000000000003ffffULL, // mask / 2^384
0x00000000001fffffULL, // mask / 2^384
0x0000000000ffffffULL, // mask / 2^384
0x000000000fffffffULL, // mask / 2^384
0x000000007fffffffULL, // mask / 2^384
0x00000003ffffffffULL, // mask / 2^384
0x0000003fffffffffULL, // mask / 2^384
0x000001ffffffffffULL, // mask / 2^384
0x00000fffffffffffULL, // mask / 2^384
0x0000ffffffffffffULL, // mask / 2^384
0x0007ffffffffffffULL, // mask / 2^384
0x003fffffffffffffULL, // mask / 2^384
0x03ffffffffffffffULL, // mask / 2^384
0x1fffffffffffffffULL, // mask / 2^384
0xffffffffffffffffULL, // mask / 2^384
0x0000000000000007ULL, // mask / 2^448
0x000000000000007fULL, // mask / 2^448
0x00000000000003ffULL, // mask / 2^448
0x0000000000001fffULL, // mask / 2^448
0x000000000001ffffULL, // mask / 2^448
0x00000000000fffffULL, // mask / 2^448
0x00000000007fffffULL, // mask / 2^448
0x0000000007ffffffULL, // mask / 2^448
0x000000003fffffffULL, // mask / 2^448
0x00000001ffffffffULL, // mask / 2^448
0x0000001fffffffffULL, // mask / 2^448
0x000000ffffffffffULL, // mask / 2^448
0x000007ffffffffffULL, // mask / 2^448
0x00007fffffffffffULL, // mask / 2^448
0x0003ffffffffffffULL, // mask / 2^448
0x001fffffffffffffULL, // mask / 2^448
0x01ffffffffffffffULL // mask / 2^448
};
UINT256 ten2mxtrunc256[] = {
{{0xccccccccccccccccULL, 0xccccccccccccccccULL,
0xccccccccccccccccULL, 0xccccccccccccccccULL}},
// (ten2mx >> 256) = cccccccccccccccc cccccccccccccccc
// cccccccccccccccccccccccccccccccc
{{0x70a3d70a3d70a3d7ULL, 0xd70a3d70a3d70a3dULL,
0x3d70a3d70a3d70a3ULL, 0xa3d70a3d70a3d70aULL}},
// (ten2mx >> 256) = a3d70a3d70a3d70a 3d70a3d70a3d70a3
// d70a3d70a3d70a3d70a3d70a3d70a3d7
{{0xc083126e978d4fdfULL, 0x78d4fdf3b645a1caULL,
0x645a1cac083126e9ULL, 0x83126e978d4fdf3bULL}},
// (ten2mx >> 256) = 83126e978d4fdf3b 645a1cac083126e9
// 78d4fdf3b645a1cac083126e978d4fdf
{{0x67381d7dbf487fcbULL, 0xc154c985f06f6944ULL,
0xd3c36113404ea4a8ULL, 0xd1b71758e219652bULL}},
// (ten2mx >> 256) = d1b71758e219652b d3c36113404ea4a8
// c154c985f06f694467381d7dbf487fcb
{{0x85c67dfe32a0663cULL, 0xcddd6e04c0592103ULL,
0x0fcf80dc33721d53ULL, 0xa7c5ac471b478423ULL}},
// (ten2mx >> 256) = a7c5ac471b478423 fcf80dc33721d53
// cddd6e04c059210385c67dfe32a0663c
{{0x37d1fe64f54d1e96ULL, 0xd7e45803cd141a69ULL,
0xa63f9a49c2c1b10fULL, 0x8637bd05af6c69b5ULL}},
// (ten2mx >> 256) = 8637bd05af6c69b5 a63f9a49c2c1b10f
// d7e45803cd141a6937d1fe64f54d1e96
{{0x8c8330a1887b6424ULL, 0x8ca08cd2e1b9c3dbULL,
0x3d32907604691b4cULL, 0xd6bf94d5e57a42bcULL}},
// (ten2mx >> 256) = d6bf94d5e57a42bc 3d32907604691b4c
// 8ca08cd2e1b9c3db8c8330a1887b6424
{{0x7068f3b46d2f8350ULL, 0x3d4d3d758161697cULL,
0xfdc20d2b36ba7c3dULL, 0xabcc77118461cefcULL}},
// (ten2mx >> 256) = abcc77118461cefc fdc20d2b36ba7c3d
// 3d4d3d758161697c7068f3b46d2f8350
{{0xf387295d242602a6ULL, 0xfdd7645e011abac9ULL,
0x31680a88f8953030ULL, 0x89705f4136b4a597ULL}},
// (ten2mx >> 256) = 89705f4136b4a597 31680a88f8953030
// fdd7645e011abac9f387295d242602a6
{{0xb8d8422ea03cd10aULL, 0x2fbf06fcce912adcULL,
0xb573440e5a884d1bULL, 0xdbe6fecebdedd5beULL}},
// (ten2mx >> 256) = dbe6fecebdedd5be b573440e5a884d1b
// 2fbf06fcce912adcb8d8422ea03cd10a
{{0x93e034f219ca40d5ULL, 0xf2ff38ca3eda88b0ULL,
0xf78f69a51539d748ULL, 0xafebff0bcb24aafeULL}},
// (ten2mx >> 256) = afebff0bcb24aafe f78f69a51539d748
// f2ff38ca3eda88b093e034f219ca40d5
{{0x4319c3f4e16e9a44ULL, 0xf598fa3b657ba08dULL,
0xf93f87b7442e45d3ULL, 0x8cbccc096f5088cbULL}},
// (ten2mx >> 256) = 8cbccc096f5088cb f93f87b7442e45d3
// f598fa3b657ba08d4319c3f4e16e9a44
{{0x04f606549be42a06ULL, 0x88f4c3923bf900e2ULL,
0x2865a5f206b06fb9ULL, 0xe12e13424bb40e13ULL}},
// (ten2mx >> 256) = e12e13424bb40e13 2865a5f206b06fb9
// 88f4c3923bf900e204f606549be42a06
{{0x03f805107cb68805ULL, 0x6d909c74fcc733e8ULL,
0x538484c19ef38c94ULL, 0xb424dc35095cd80fULL}},
// (ten2mx >> 256) = b424dc35095cd80f 538484c19ef38c94
// 6d909c74fcc733e803f805107cb68805
{{0x3660040d3092066aULL, 0x57a6e390ca38f653ULL,
0x0f9d37014bf60a10ULL, 0x901d7cf73ab0acd9ULL}},
// (ten2mx >> 256) = 901d7cf73ab0acd9 f9d37014bf60a10
// 57a6e390ca38f6533660040d3092066a
{{0x23ccd3484db670aaULL, 0xbf716c1add27f085ULL,
0x4c2ebe687989a9b3ULL, 0xe69594bec44de15bULL}},
// (ten2mx >> 256) = e69594bec44de15b 4c2ebe687989a9b3
// bf716c1add27f08523ccd3484db670aa
{{0x4fd70f6d0af85a22ULL, 0xff8df0157db98d37ULL,
0x09befeb9fad487c2ULL, 0xb877aa3236a4b449ULL}},
// (ten2mx >> 256) = b877aa3236a4b449 9befeb9fad487c2
// ff8df0157db98d374fd70f6d0af85a22
{{0x0cac0c573bf9e1b5ULL, 0x32d7f344649470f9ULL,
0x3aff322e62439fcfULL, 0x9392ee8e921d5d07ULL}},
// (ten2mx >> 256) = 9392ee8e921d5d07 3aff322e62439fcf
// 32d7f344649470f90cac0c573bf9e1b5
{{0xe11346f1f98fcf88ULL, 0x1e2652070753e7f4ULL,
0x2b31e9e3d06c32e5ULL, 0xec1e4a7db69561a5ULL}},
// (ten2mx >> 256) = ec1e4a7db69561a5 2b31e9e3d06c32e5
// 1e2652070753e7f4e11346f1f98fcf88
{{0x4da9058e613fd939ULL, 0x181ea8059f76532aULL,
0x88f4bb1ca6bcf584ULL, 0xbce5086492111aeaULL}},
// (ten2mx >> 256) = bce5086492111aea 88f4bb1ca6bcf584
// 181ea8059f76532a4da9058e613fd939
{{0xa48737a51a997a94ULL, 0x467eecd14c5ea8eeULL,
0xd3f6fc16ebca5e03ULL, 0x971da05074da7beeULL}},
// (ten2mx >> 256) = 971da05074da7bee d3f6fc16ebca5e03
// 467eecd14c5ea8eea48737a51a997a94
{{0x3a71f2a1c428c420ULL, 0x70cb148213caa7e4ULL,
0x5324c68b12dd6338ULL, 0xf1c90080baf72cb1ULL}},
// (ten2mx >> 256) = f1c90080baf72cb1 5324c68b12dd6338
// 70cb148213caa7e43a71f2a1c428c420
{{0x2ec18ee7d0209ce7ULL, 0x8d6f439b43088650ULL,
0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}},
// (ten2mx >> 256) = c16d9a0095928a27 75b7053c0f178293
// 8d6f439b430886502ec18ee7d0209ce7
{{0xf23472530ce6e3ecULL, 0xd78c3615cf3a050cULL,
0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}},
// (ten2mx >> 256) = 9abe14cd44753b52 c4926a9672793542
// d78c3615cf3a050cf23472530ce6e3ec
{{0xe9ed83b814a49fe0ULL, 0x8c1389bc7ec33b47ULL,
0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}},
// (ten2mx >> 256) = f79687aed3eec551 3a83ddbd83f52204
// 8c1389bc7ec33b47e9ed83b814a49fe0
{{0x87f1362cdd507fe6ULL, 0x3cdc6e306568fc39ULL,
0x95364afe032a819dULL, 0xc612062576589ddaULL}},
// (ten2mx >> 256) = c612062576589dda 95364afe032a819d
// 3cdc6e306568fc3987f1362cdd507fe6
{{0x9ff42b5717739985ULL, 0xca49f1c05120c9c7ULL,
0x775ea264cf55347dULL, 0x9e74d1b791e07e48ULL}},
// (ten2mx >> 256) = 9e74d1b791e07e48 775ea264cf55347d
// ca49f1c05120c9c79ff42b5717739985
{{0xccb9def1bf1f5c08ULL, 0x76dcb60081ce0fa5ULL,
0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}},
// (ten2mx >> 256) = fd87b5f28300ca0d 8bca9d6e188853fc
// 76dcb60081ce0fa5ccb9def1bf1f5c08
{{0xa3c7e58e327f7cd3ULL, 0x5f16f80067d80c84ULL,
0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}},
// (ten2mx >> 256) = cad2f7f5359a3b3e 96ee45813a04330
// 5f16f80067d80c84a3c7e58e327f7cd3
{{0xb6398471c1ff970fULL, 0x18df2ccd1fe00a03ULL,
0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}},
// (ten2mx >> 256) = a2425ff75e14fc31 a1258379a94d028d
// 18df2ccd1fe00a03b6398471c1ff970f
{{0xf82e038e34cc78d9ULL, 0x4718f0a419800802ULL,
0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}},
// (ten2mx >> 256) = 81ceb32c4b43fcf4 80eacf948770ced7
// 4718f0a419800802f82e038e34cc78d9
{{0x59e338e387ad8e28ULL, 0x0b5b1aa028ccd99eULL,
0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}},
// (ten2mx >> 256) = cfb11ead453994ba 67de18eda5814af2
// b5b1aa028ccd99e59e338e387ad8e28
{{0x47e8fa4f9fbe0b53ULL, 0x6f7c154ced70ae18ULL,
0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}},
// (ten2mx >> 256) = a6274bbdd0fadd61 ecb1ad8aeacdd58e
// 6f7c154ced70ae1847e8fa4f9fbe0b53
{{0xd320c83fb2fe6f75ULL, 0xbf967770bdf3be79ULL,
0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}},
// (ten2mx >> 256) = 84ec3c97da624ab4 bd5af13bef0b113e
// bf967770bdf3be79d320c83fb2fe6f75
{{0x85014065eb30b256ULL, 0x65bd8be79652ca5cULL,
0x955e4ec64b44e864ULL, 0xd4ad2dbfc3d07787ULL}},
// (ten2mx >> 256) = d4ad2dbfc3d07787 955e4ec64b44e864
// 65bd8be79652ca5c85014065eb30b256
{{0xd0cdcd1e55c08eabULL, 0xeafe098611dbd516ULL,
0xdde50bd1d5d0b9e9ULL, 0xaa242499697392d2ULL}},
// (ten2mx >> 256) = aa242499697392d2 dde50bd1d5d0b9e9
// eafe098611dbd516d0cdcd1e55c08eab
{{0x40a4a418449a0bbcULL, 0xbbfe6e04db164412ULL,
0x7e50d64177da2e54ULL, 0x881cea14545c7575ULL}},
// (ten2mx >> 256) = 881cea14545c7575 7e50d64177da2e54
// bbfe6e04db16441240a4a418449a0bbc
{{0x9aa1068d3a9012c7ULL, 0x2cca49a15e8a0683ULL,
0x96e7bd358c904a21ULL, 0xd9c7dced53c72255ULL}},
// (ten2mx >> 256) = d9c7dced53c72255 96e7bd358c904a21
// 2cca49a15e8a06839aa1068d3a9012c7
{{0x154d9ed7620cdbd2ULL, 0x8a3b6e1ab2080536ULL,
0xabec975e0a0d081aULL, 0xae397d8aa96c1b77ULL}},
// (ten2mx >> 256) = ae397d8aa96c1b77 abec975e0a0d081a
// 8a3b6e1ab2080536154d9ed7620cdbd2
{{0x443e18ac4e70afdbULL, 0x3b62be7bc1a0042bULL,
0x2323ac4b3b3da015ULL, 0x8b61313bbabce2c6ULL}},
// (ten2mx >> 256) = 8b61313bbabce2c6 2323ac4b3b3da015
// 3b62be7bc1a0042b443e18ac4e70afdb
{{0x6d30277a171ab2f8ULL, 0x5f0463f935ccd378ULL,
0x6b6c46dec52f6688ULL, 0xdf01e85f912e37a3ULL}},
// (ten2mx >> 256) = df01e85f912e37a3 6b6c46dec52f6688
// 5f0463f935ccd3786d30277a171ab2f8
{{0x8a8cec61ac155bfaULL, 0x7f36b660f7d70f93ULL,
0x55f038b237591ed3ULL, 0xb267ed1940f1c61cULL}},
// (ten2mx >> 256) = b267ed1940f1c61c 55f038b237591ed3
// 7f36b660f7d70f938a8cec61ac155bfa
{{0x3ba3f04e23444995ULL, 0xcc2bc51a5fdf3fa9ULL,
0x77f3608e92adb242ULL, 0x8eb98a7a9a5b04e3ULL}},
// (ten2mx >> 256) = 8eb98a7a9a5b04e3 77f3608e92adb242
// cc2bc51a5fdf3fa93ba3f04e23444995
{{0xf9064d49d206dc21ULL, 0xe046082a32fecc41ULL,
0x8cb89a7db77c506aULL, 0xe45c10c42a2b3b05ULL}},
// (ten2mx >> 256) = e45c10c42a2b3b05 8cb89a7db77c506a
// e046082a32fecc41f9064d49d206dc21
{{0xfa6b7107db38b01aULL, 0x4d04d354f598a367ULL,
0x3d607b97c5fd0d22ULL, 0xb6b00d69bb55c8d1ULL}},
// (ten2mx >> 256) = b6b00d69bb55c8d1 3d607b97c5fd0d22
// 4d04d354f598a367fa6b7107db38b01a
{{0xfb8927397c2d59afULL, 0x3d9d75dd9146e91fULL,
0xcab3961304ca70e8ULL, 0x9226712162ab070dULL}},
// (ten2mx >> 256) = 9226712162ab070d cab3961304ca70e8
// 3d9d75dd9146e91ffb8927397c2d59af
{{0xf8db71f5937bc2b1ULL, 0xc8fbefc8e87174ffULL,
0xaab8f01e6e10b4a6ULL, 0xe9d71b689dde71afULL}},
// (ten2mx >> 256) = e9d71b689dde71af aab8f01e6e10b4a6
// c8fbefc8e87174fff8db71f5937bc2b1
{{0x2d7c5b2adc630227ULL, 0x3a63263a538df733ULL,
0x5560c018580d5d52ULL, 0xbb127c53b17ec159ULL}},
// (ten2mx >> 256) = bb127c53b17ec159 5560c018580d5d52
// 3a63263a538df7332d7c5b2adc630227
{{0x24637c2249e8ce86ULL, 0x2eb5b82ea93e5f5cULL,
0xdde7001379a44aa8ULL, 0x95a8637627989aadULL}},
// (ten2mx >> 256) = 95a8637627989aad dde7001379a44aa8
// 2eb5b82ea93e5f5c24637c2249e8ce86
{{0x3a38c69d430e173dULL, 0x4abc59e441fd6560ULL,
0x963e66858f6d4440ULL, 0xef73d256a5c0f77cULL}},
// (ten2mx >> 256) = ef73d256a5c0f77c 963e66858f6d4440
// 4abc59e441fd65603a38c69d430e173d
{{0x94fa387dcf3e78fdULL, 0x6efd14b69b311de6ULL,
0xde98520472bdd033ULL, 0xbf8fdb78849a5f96ULL}},
// (ten2mx >> 256) = bf8fdb78849a5f96 de98520472bdd033
// 6efd14b69b311de694fa387dcf3e78fd
{{0xaa61c6cb0c31fa64ULL, 0x259743c548f417ebULL,
0xe546a8038efe4029ULL, 0x993fe2c6d07b7fabULL}},
// (ten2mx >> 256) = 993fe2c6d07b7fab e546a8038efe4029
// 259743c548f417ebaa61c6cb0c31fa64
{{0xaa360ade79e990a1ULL, 0x3c25393ba7ecf312ULL,
0xd53dd99f4b3066a8ULL, 0xf53304714d9265dfULL}},
// (ten2mx >> 256) = f53304714d9265df d53dd99f4b3066a8
// 3c25393ba7ecf312aa360ade79e990a1
{{0x882b3be52e5473b4ULL, 0x96842dc95323f5a8ULL,
0xaa97e14c3c26b886ULL, 0xc428d05aa4751e4cULL}},
// (ten2mx >> 256) = c428d05aa4751e4c aa97e14c3c26b886
// 96842dc95323f5a8882b3be52e5473b4
{{0xd355c98425105c90ULL, 0xab9cf16ddc1cc486ULL,
0x55464dd69685606bULL, 0x9ced737bb6c4183dULL}},
// (ten2mx >> 256) = 9ced737bb6c4183d 55464dd69685606b
// ab9cf16ddc1cc486d355c98425105c90
{{0xebbc75a03b4d60e6ULL, 0xac2e4f162cfad40aULL,
0xeed6e2f0f0d56712ULL, 0xfb158592be068d2eULL}},
// (ten2mx >> 256) = fb158592be068d2e eed6e2f0f0d56712
// ac2e4f162cfad40aebbc75a03b4d60e6
{{0x8963914cfc3de71eULL, 0x568b727823fbdcd5ULL,
0xf245825a5a445275ULL, 0xc8de047564d20a8bULL}},
// (ten2mx >> 256) = c8de047564d20a8b f245825a5a445275
// 568b727823fbdcd58963914cfc3de71e
{{0xd44fa770c9cb1f4bULL, 0x453c5b934ffcb0aaULL,
0x5b6aceaeae9d0ec4ULL, 0xa0b19d2ab70e6ed6ULL}},
// (ten2mx >> 256) = a0b19d2ab70e6ed6 5b6aceaeae9d0ec4
// 453c5b934ffcb0aad44fa770c9cb1f4b
{{0xdd0c85f3d4a27f6fULL, 0x37637c75d996f3bbULL,
0xe2bbd88bbee40bd0ULL, 0x808e17555f3ebf11ULL}},
// (ten2mx >> 256) = 808e17555f3ebf11 e2bbd88bbee40bd0
// 37637c75d996f3bbdd0c85f3d4a27f6f
{{0x61ada31fba9d98b2ULL, 0x256bfa5628f185f9ULL,
0x3792f412cb06794dULL, 0xcdb02555653131b6ULL}},
// (ten2mx >> 256) = cdb02555653131b6 3792f412cb06794d
// 256bfa5628f185f961ada31fba9d98b2
{{0xe7be1c196217ad5bULL, 0x51232eab53f46b2dULL,
0x5fa8c3423c052dd7ULL, 0xa48ceaaab75a8e2bULL}},
// (ten2mx >> 256) = a48ceaaab75a8e2b 5fa8c3423c052dd7
// 51232eab53f46b2de7be1c196217ad5b
{{0x52fe7ce11b462449ULL, 0x40e8f222a99055beULL,
0x1953cf68300424acULL, 0x83a3eeeef9153e89ULL}},
// (ten2mx >> 256) = 83a3eeeef9153e89 1953cf68300424ac
// 40e8f222a99055be52fe7ce11b462449
{{0x51972e34f8703a0fULL, 0x34a7e9d10f4d55fdULL,
0x8eec7f0d19a03aadULL, 0xd29fe4b18e88640eULL}},
// (ten2mx >> 256) = d29fe4b18e88640e 8eec7f0d19a03aad
// 34a7e9d10f4d55fd51972e34f8703a0f
{{0x0e128b5d938cfb3fULL, 0x2a1fee40d90aab31ULL,
0x3f2398d747b36224ULL, 0xa87fea27a539e9a5ULL}},
// (ten2mx >> 256) = a87fea27a539e9a5 3f2398d747b36224
// 2a1fee40d90aab310e128b5d938cfb3f
{{0x3e753c4adc70c8ffULL, 0xbb4cbe9a473bbc27ULL,
0x98e947129fc2b4e9ULL, 0x86ccbb52ea94baeaULL}},
// (ten2mx >> 256) = 86ccbb52ea94baea 98e947129fc2b4e9
// bb4cbe9a473bbc273e753c4adc70c8ff
{{0x30bb93aafa4e0e65ULL, 0x9214642a0b92c6a5ULL,
0x5b0ed81dcc6abb0fULL, 0xd7adf884aa879177ULL}},
// (ten2mx >> 256) = d7adf884aa879177 5b0ed81dcc6abb0f
// 9214642a0b92c6a530bb93aafa4e0e65
{{0xc0960fbbfb71a51eULL, 0xa8105021a2dbd21dULL,
0xe272467e3d222f3fULL, 0xac8b2d36eed2dac5ULL}},
// (ten2mx >> 256) = ac8b2d36eed2dac5 e272467e3d222f3f
// a8105021a2dbd21dc0960fbbfb71a51e
{{0x66de72fcc927b74bULL, 0xb9a6a6814f1641b1ULL,
0x1b8e9ecb641b58ffULL, 0x8a08f0f8bf0f156bULL}},
// (ten2mx >> 256) = 8a08f0f8bf0f156b 1b8e9ecb641b58ff
// b9a6a6814f1641b166de72fcc927b74b
{{0xd7ca5194750c5878ULL, 0xf5d770cee4f0691bULL,
0xf8e431456cf88e65ULL, 0xdcdb1b2798182244ULL}},
// (ten2mx >> 256) = dcdb1b2798182244 f8e431456cf88e65
// f5d770cee4f0691bd7ca5194750c5878
{{0xdfd50e105da379f9ULL, 0x9179270bea59edafULL,
0x2d835a9df0c6d851ULL, 0xb0af48ec79ace837ULL}},
// (ten2mx >> 256) = b0af48ec79ace837 2d835a9df0c6d851
// 9179270bea59edafdfd50e105da379f9
{{0x19773e737e1c6194ULL, 0x0dfa85a321e18af3ULL,
0x579c487e5a38ad0eULL, 0x8d590723948a535fULL}},
// (ten2mx >> 256) = 8d590723948a535f 579c487e5a38ad0e
// dfa85a321e18af319773e737e1c6194
{{0xf58b971f302d68eeULL, 0x165da29e9c9c1184ULL,
0x25c6da63c38de1b0ULL, 0xe2280b6c20dd5232ULL}},
// (ten2mx >> 256) = e2280b6c20dd5232 25c6da63c38de1b0
// 165da29e9c9c1184f58b971f302d68ee
{{0xc46fac18f3578724ULL, 0x4517b54bb07cdad0ULL,
0x1e38aeb6360b1af3ULL, 0xb4ecd5f01a4aa828ULL}},
// (ten2mx >> 256) = b4ecd5f01a4aa828 1e38aeb6360b1af3
// 4517b54bb07cdad0c46fac18f3578724
{{0x36bfbce0c2ac6c1dULL, 0x9dac910959fd7bdaULL,
0xb1c6f22b5e6f48c2ULL, 0x90bd77f3483bb9b9ULL}},
// (ten2mx >> 256) = 90bd77f3483bb9b9 b1c6f22b5e6f48c2
// 9dac910959fd7bda36bfbce0c2ac6c1d
{{0x2465fb01377a4695ULL, 0x2f7a81a88ffbf95dULL,
0xb60b1d1230b20e04ULL, 0xe7958cb87392c2c2ULL}}
// (ten2mx >> 256) = e7958cb87392c2c2 b60b1d1230b20e04
// 2f7a81a88ffbf95d2465fb01377a4695
};