ReactOS 0.4.15-dev-7958-gcd0bb1a
__64tof.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS CRT library
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Integer to float conversion (__i64tod/u64tod/i64tos/u64tos)
5 * COPYRIGHT: Copyright 2021 Roman Masanin <36927roma@gmail.com>
6 */
7
8#ifdef _USE_64_BITS_
9typedef double FLOAT_TYPE;
10typedef unsigned long long FINT_TYPE;
11#define FRACTION_LEN 52
12#define EXPONENT_LEN 11
13#define SHIFT_OFFSET EXPONENT_LEN
14#else
15typedef float FLOAT_TYPE;
16typedef unsigned int FINT_TYPE;
17#define FRACTION_LEN 23
18#define EXPONENT_LEN 8
19#define SHIFT_OFFSET (EXPONENT_LEN + 32)
20#endif
21
22#ifdef _USE_SIGNED_
23typedef long long INT64SU;
24#else
25typedef unsigned long long INT64SU;
26#endif
27
28typedef union _FLOAT_RESULT
29{
33
34#define SIGN_MASK 0x8000000000000000ULL
35
36#define EXPONENT_ZERO ((1 << (EXPONENT_LEN - 1)) - 1)
37
38#define NEGATE(x) (~(x) + 1)
39
42{
45 int count = 0;
46 unsigned long long mask = SIGN_MASK;
47
48 if (value == 0)
49 return (FLOAT_TYPE)0;
50
51#ifdef _USE_SIGNED_
52 if (value & SIGN_MASK)
53 {
55 /* set Sign bit using exponent */
56 exponent |= 1 << EXPONENT_LEN;
57 }
58#endif
59
60 for (; count < 64; count++)
61 {
62 if (value & mask)
63 break;
64 mask = mask >> 1;
65 }
66
68 /* exponent is FRACTION_LEN - count */
69 exponent -= count;
70 result.raw = exponent << FRACTION_LEN;
71
72 mask--;
73 value = value & mask;
74 if (value == 0)
75 return result.value;
76
77 if (count == 0)
78 {
79 result.raw |= value;
80 }
81 else if (count < 0)
82 {
83 count = NEGATE(count) - 1;
84 value = value >> count;
85 mask = value & 1;
86 result.raw |= value >> 1;
87
88 /* round up if left most bit of lost data is 1 */
89 if (mask)
90 result.raw++;
91 }
92 else
93 {
94 result.raw |= value << count;
95 }
96
97 return result.value;
98}
#define NEGATE(x)
Definition: __64tof.h:38
unsigned long long INT64SU
Definition: __64tof.h:25
#define EXPONENT_LEN
Definition: __64tof.h:18
union _FLOAT_RESULT FLOAT_RESULT
unsigned int FINT_TYPE
Definition: __64tof.h:16
#define SHIFT_OFFSET
Definition: __64tof.h:19
#define FRACTION_LEN
Definition: __64tof.h:17
#define SIGN_MASK
Definition: __64tof.h:34
#define EXPONENT_ZERO
Definition: __64tof.h:36
float FLOAT_TYPE
Definition: __64tof.h:15
#define __64tof
Definition: __i64tod.c:8
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum GLint GLuint mask
Definition: glext.h:6028
GLuint64EXT * result
Definition: glext.h:11304
FLOAT_TYPE value
Definition: __64tof.h:30
FINT_TYPE raw
Definition: __64tof.h:31
Definition: pdh_main.c:94