9#define _ALLOW_OLD_VALIDATE_MACROS
21#define PTR_12(x) ((uint8_t*)(&(x)->ld12))
23#define MSB_USHORT ((uint16_t) 0x8000)
24#define MSB_ULONG ((uint32_t) 0x80000000)
28#define LD_MAX_EXP_LEN 4
29#define LD_MAX_MAN_LEN 24
30#define LD_MAX_MAN_LEN1 25
33#define LD_BIASM1 0x3ffe
34#define LD_MAXEXP 0x7fff
49#define ALIGN(x) ((unsigned long _UNALIGNED*)(x))
51#define U_EXP_12(p) ((uint16_t *)(PTR_12(p) + 10))
52#define UL_MANHI_12(p) ((uint32_t _UNALIGNED*)(PTR_12(p) + 6))
53#define UL_MANLO_12(p) ((uint32_t _UNALIGNED*)(PTR_12(p) + 2))
54#define U_XT_12(p) ((uint16_t *)(PTR_12(p) ))
57#define UL_LO_12(p) ((uint32_t*)(PTR_12(p) ))
58#define UL_MED_12(p) ((uint32_t*)(PTR_12(p) + 4))
59#define UL_HI_12(p) ((uint32_t*)(PTR_12(p) + 8))
62#define UCHAR_12(p, i) ((uint8_t *)( PTR_12(p) + (i)))
63#define USHORT_12(p, i) ((uint16_t*)((uint8_t*)PTR_12(p) + (i)))
64#define ULONG_12(p, i) ((uint32_t*)((uint8_t*)PTR_12(p) + (i)))
65#define TEN_BYTE_PART(p) ((uint8_t *)( PTR_12(p) + 2 ))
68#define U_EXP_LD(p) ((uint16_t*)(_PTR_LD(p) + 8))
69#define UL_MANHI_LD(p) ((uint32_t*)(_PTR_LD(p) + 4))
70#define UL_MANLO_LD(p) ((uint32_t*)(_PTR_LD(p) ))
73#define U_SHORT4_D(p) ((uint16_t*)(p) + 3)
74#define UL_HI_D(p) ((uint32_t*)(p) + 1)
75#define UL_LO_D(p) ((uint32_t*)(p) )
77#define PUT_INF_12(p, sign) \
78 *UL_HI_12 (p) = (sign) ? 0xffff8000 : 0x7fff8000; \
82#define PUT_ZERO_12(p) \
88 ((*UL_HI_12 (p) & 0x7fffffff) == 0 && \
89 *UL_MED_12(p) == 0 && \
92#define PUT_INF_LD(p, sign) \
93 *U_EXP_LD (p) = (sign) ? 0xffff : 0x7fff; \
94 *UL_MANHI_LD(p) = 0x8000; \
97#define PUT_ZERO_LD(p) \
99 *UL_MANHI_LD(p) = 0; \
102#define ISZERO_LD(p) \
103 ((*U_EXP_LD (p) & 0x7fff) == 0 && \
104 *UL_MANHI_LD(p) == 0 && \
105 *UL_MANLO_LD(p) == 0)
111 {{0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x02,0x40}},
112 {{0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x05,0x40}},
113 {{0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFA,0x08,0x40}},
114 {{0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x9C,0x0C,0x40}},
115 {{0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xC3,0x0F,0x40}},
116 {{0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xF4,0x12,0x40}},
117 {{0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x96,0x98,0x16,0x40}},
118 {{0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x20,0xBC,0xBE,0x19,0x40}},
119 {{0x00,0x00, 0x00,0x00,0x00,0x04,0xBF,0xC9,0x1B,0x8E,0x34,0x40}},
120 {{0x00,0x00, 0x00,0xA1,0xED,0xCC,0xCE,0x1B,0xC2,0xD3,0x4E,0x40}},
121 {{0x20,0xF0, 0x9E,0xB5,0x70,0x2B,0xA8,0xAD,0xC5,0x9D,0x69,0x40}},
122 {{0xD0,0x5D, 0xFD,0x25,0xE5,0x1A,0x8E,0x4F,0x19,0xEB,0x83,0x40}},
123 {{0x71,0x96, 0xD7,0x95,0x43,0x0E,0x05,0x8D,0x29,0xAF,0x9E,0x40}},
124 {{0xF9,0xBF, 0xA0,0x44,0xED,0x81,0x12,0x8F,0x81,0x82,0xB9,0x40}},
125 {{0xBF,0x3C, 0xD5,0xA6,0xCF,0xFF,0x49,0x1F,0x78,0xC2,0xD3,0x40}},
126 {{0x6F,0xC6, 0xE0,0x8C,0xE9,0x80,0xC9,0x47,0xBA,0x93,0xA8,0x41}},
127 {{0xBC,0x85, 0x6B,0x55,0x27,0x39,0x8D,0xF7,0x70,0xE0,0x7C,0x42}},
128 {{0xBC,0xDD, 0x8E,0xDE,0xF9,0x9D,0xFB,0xEB,0x7E,0xAA,0x51,0x43}},
129 {{0xA1,0xE6, 0x76,0xE3,0xCC,0xF2,0x29,0x2F,0x84,0x81,0x26,0x44}},
130 {{0x28,0x10, 0x17,0xAA,0xF8,0xAE,0x10,0xE3,0xC5,0xC4,0xFA,0x44}},
131 {{0xEB,0xA7, 0xD4,0xF3,0xF7,0xEB,0xE1,0x4A,0x7A,0x95,0xCF,0x45}},
132 {{0x65,0xCC, 0xC7,0x91,0x0E,0xA6,0xAE,0xA0,0x19,0xE3,0xA3,0x46}},
133 {{0x0D,0x65, 0x17,0x0C,0x75,0x81,0x86,0x75,0x76,0xC9,0x48,0x4D}},
134 {{0x58,0x42, 0xE4,0xA7,0x93,0x39,0x3B,0x35,0xB8,0xB2,0xED,0x53}},
135 {{0x4D,0xA7, 0xE5,0x5D,0x3D,0xC5,0x5D,0x3B,0x8B,0x9E,0x92,0x5A}},
136 {{0xFF,0x5D, 0xA6,0xF0,0xA1,0x20,0xC0,0x54,0xA5,0x8C,0x37,0x61}},
137 {{0xD1,0xFD, 0x8B,0x5A,0x8B,0xD8,0x25,0x5D,0x89,0xF9,0xDB,0x67}},
138 {{0xAA,0x95, 0xF8,0xF3,0x27,0xBF,0xA2,0xC8,0x5D,0xDD,0x80,0x6E}},
139 {{0x4C,0xC9, 0x9B,0x97,0x20,0x8A,0x02,0x52,0x60,0xC4,0x25,0x75}}
144 {{0xCD,0xCC, 0xCD,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xFB,0x3F}},
145 {{0x71,0x3D, 0x0A,0xD7,0xA3,0x70,0x3D,0x0A,0xD7,0xA3,0xF8,0x3F}},
146 {{0x5A,0x64, 0x3B,0xDF,0x4F,0x8D,0x97,0x6E,0x12,0x83,0xF5,0x3F}},
147 {{0xC3,0xD3, 0x2C,0x65,0x19,0xE2,0x58,0x17,0xB7,0xD1,0xF1,0x3F}},
148 {{0xD0,0x0F, 0x23,0x84,0x47,0x1B,0x47,0xAC,0xC5,0xA7,0xEE,0x3F}},
149 {{0x40,0xA6, 0xB6,0x69,0x6C,0xAF,0x05,0xBD,0x37,0x86,0xEB,0x3F}},
150 {{0x33,0x3D, 0xBC,0x42,0x7A,0xE5,0xD5,0x94,0xBF,0xD6,0xE7,0x3F}},
151 {{0xC2,0xFD, 0xFD,0xCE,0x61,0x84,0x11,0x77,0xCC,0xAB,0xE4,0x3F}},
152 {{0x2F,0x4C, 0x5B,0xE1,0x4D,0xC4,0xBE,0x94,0x95,0xE6,0xC9,0x3F}},
153 {{0x92,0xC4, 0x53,0x3B,0x75,0x44,0xCD,0x14,0xBE,0x9A,0xAF,0x3F}},
154 {{0xDE,0x67, 0xBA,0x94,0x39,0x45,0xAD,0x1E,0xB1,0xCF,0x94,0x3F}},
155 {{0x24,0x23, 0xC6,0xE2,0xBC,0xBA,0x3B,0x31,0x61,0x8B,0x7A,0x3F}},
156 {{0x61,0x55, 0x59,0xC1,0x7E,0xB1,0x53,0x7C,0x12,0xBB,0x5F,0x3F}},
157 {{0xD7,0xEE, 0x2F,0x8D,0x06,0xBE,0x92,0x85,0x15,0xFB,0x44,0x3F}},
158 {{0x24,0x3F, 0xA5,0xE9,0x39,0xA5,0x27,0xEA,0x7F,0xA8,0x2A,0x3F}},
159 {{0x7D,0xAC, 0xA1,0xE4,0xBC,0x64,0x7C,0x46,0xD0,0xDD,0x55,0x3E}},
160 {{0x63,0x7B, 0x06,0xCC,0x23,0x54,0x77,0x83,0xFF,0x91,0x81,0x3D}},
161 {{0x91,0xFA, 0x3A,0x19,0x7A,0x63,0x25,0x43,0x31,0xC0,0xAC,0x3C}},
162 {{0x21,0x89, 0xD1,0x38,0x82,0x47,0x97,0xB8,0x00,0xFD,0xD7,0x3B}},
163 {{0xDC,0x88, 0x58,0x08,0x1B,0xB1,0xE8,0xE3,0x86,0xA6,0x03,0x3B}},
164 {{0xC6,0x84, 0x45,0x42,0x07,0xB6,0x99,0x75,0x37,0xDB,0x2E,0x3A}},
165 {{0x33,0x71, 0x1C,0xD2,0x23,0xDB,0x32,0xEE,0x49,0x90,0x5A,0x39}},
166 {{0xA6,0x87, 0xBE,0xC0,0x57,0xDA,0xA5,0x82,0xA6,0xA2,0xB5,0x32}},
167 {{0xE2,0x68, 0xB2,0x11,0xA7,0x52,0x9F,0x44,0x59,0xB7,0x10,0x2C}},
168 {{0x25,0x49, 0xE4,0x2D,0x36,0x34,0x4F,0x53,0xAE,0xCE,0x6B,0x25}},
169 {{0x8F,0x59, 0x04,0xA4,0xC0,0xDE,0xC2,0x7D,0xFB,0xE8,0xC6,0x1E}},
170 {{0x9E,0xE7, 0x88,0x5A,0x57,0x91,0x3C,0xBF,0x50,0x83,0x22,0x18}},
171 {{0x4E,0x4B, 0x65,0x62,0xFD,0x83,0x8F,0xAF,0x06,0x94,0x7D,0x11}},
172 {{0xE4,0x2D, 0xDE,0x9F,0xCE,0xD2,0xC8,0x04,0xDD,0xA6,0xD8,0x0A}}
185 return r <
x ||
r <
y;
216 static_assert(msb_bits <= total_bits,
"shift too large");
218 uint32_t const lsb_mask{(1 << (lsb_bits - 1)) - 1};
297 for (
int i = 0;
i < 5; ++
i)
301 for (
int j = 5 -
i;
j > 0; --
j)
310 #if defined _M_X64 || defined _M_ARM
344 shl_ld12<1>(&tempman);
348 if (
static_cast<int16_t>(expsum) <= 0)
353 while (
static_cast<int16_t>(expsum) < 0)
368 if (*
U_XT_12(&tempman) > 0x8000 || (*
UL_LO_12(&tempman) & 0x1ffff) == 0x18000)
403 if (expsum >= 0x7fff)
432 int const last3 =
pow & 0x7;
438 _LDBL12 const* py = pow_10p + last3;
479 _LDBL12 const original_ld12 = *ld12;
494template <u
int32_t Base>
497 size_t const mantissa_count,
505 uint8_t const*
const mantissa_last = mantissa + mantissa_count;
506 for (
uint8_t const* it = mantissa; it != mantissa_last; ++it)
508 multiply_ld12_by<Base>(ld12);
594 bool const is_hexadecimal,
615 int const exponent_adjustment_multiplier = is_hexadecimal ? 4 : 1;
616 data._exponent -=
data._mantissa_count * exponent_adjustment_multiplier;
620 convert_mantissa_to_ld12<16>(
data._mantissa,
data._mantissa_count, &
result);
625 convert_mantissa_to_ld12<10>(
data._mantissa,
data._mantissa_count, &
result);
629 if (
data._is_negative)
677#define INTRNMAN_LEN 3
688 int const nb = 31 - nbit % 32;
703 if (mantissa[nl] & bitmask)
724 int const nb = 31 - nbit % 32;
743 for (; nl >= 0 && carry; --nl)
761 int const rndbit = nbit + 1;
763 int const nl = rndbit / 32;
764 int const nb = 31 - rndbit % 32;
818 _LocaleUpdate locale_update(
locale);
822 locale_update.GetLocaleT(),
824 &intermediate_result);
unsigned short int uint16_t
__forceinline void __cdecl multiply_ld12_by< 10 >(_LDBL12 *const ld12)
static _LDBL12 const ld12_pow10_positive[]
static __forceinline void __cdecl shl_ld12(_LDBL12 *const p)
static __forceinline void __cdecl multiply_two_pow_ld12(_LDBL12 *const ld12, int const power)
#define PUT_INF_12(p, sign)
static int __cdecl transform_into_return_value(SLD_STATUS const status)
static _LDBL12 const ld12_pow10_negative[]
static __forceinline void __cdecl convert_mantissa_to_ld12(uint8_t const *const mantissa, size_t const mantissa_count, _LDBL12 *const ld12)
int __cdecl _atoldbl_l(_LDOUBLE *const result, char *const string, _locale_t const locale)
static __forceinline void __cdecl add_ld12(_LDBL12 *const x, _LDBL12 const *const y)
static __forceinline void __cdecl multiply_ld12_by(_LDBL12 *)
static __forceinline void __cdecl multiply_ten_pow_ld12(_LDBL12 *const pld12, int pow)
static __forceinline void __cdecl multiply_ld12(_LDBL12 *const px, _LDBL12 const *const py)
int __cdecl _atoldbl(_LDOUBLE *const result, char *const string)
static __forceinline bool __cdecl mantissa_has_zero_tail(mantissa_t const mantissa, int const nbit)
static __forceinline bool __cdecl add_uint32_carry(uint32_t const x, uint32_t const y, uint32_t *const sum)
static __forceinline void __cdecl shr_ld12(_LDBL12 *const p)
static void __cdecl convert_ld12_to_ldouble(_LDBL12 const *const pld12, _LDOUBLE *const result)
__forceinline void __cdecl multiply_ld12_by< 16 >(_LDBL12 *const ld12)
static __forceinline bool __cdecl increment_mantissa(mantissa_t const mantissa, int const nbit)
static __forceinline bool __cdecl round_mantissa(mantissa_t const mantissa, int const precision)
double pow(double x, double y)
GLint GLint GLint GLint GLint x
GLint GLint GLint GLint GLint GLint y
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLdouble GLdouble GLdouble GLdouble q
GLenum GLint GLint * precision
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
static SLD_STATUS __cdecl common_convert_to_ldbl12(floating_point_string const &immutable_data, bool const is_hexadecimal, _LDBL12 &result)
void __cdecl assemble_floating_point_ind(_LDBL12 &result)
SLD_STATUS __cdecl convert_hexadecimal_string_to_floating_type(floating_point_string const &data, _LDBL12 &result)
void __cdecl assemble_floating_point_infinity(bool const is_negative, _LDBL12 &result)
void __cdecl assemble_floating_point_zero(bool const is_negative, _LDBL12 &result)
c_string_character_source< Character > __cdecl make_c_string_character_source(Character const *const string, EndPointer const end)
void __cdecl assemble_floating_point_snan(bool const is_negative, _LDBL12 &result)
SLD_STATUS __cdecl parse_floating_point(_locale_t const locale, CharacterSource source, FloatingType *const result)
void __cdecl assemble_floating_point_qnan(bool const is_negative, _LDBL12 &result)
SLD_STATUS __cdecl convert_decimal_string_to_floating_type(floating_point_string const &data, _LDBL12 &result)
static int sum(int x_, int y_)