Electroneum
Toggle main menu visibility
Loading...
Searching...
No Matches
ieee754.h
Go to the documentation of this file.
1
// Tencent is pleased to support the open source community by making RapidJSON available.
2
//
3
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
4
//
5
// Licensed under the MIT License (the "License"); you may not use this file except
6
// in compliance with the License. You may obtain a copy of the License at
7
//
8
// http://opensource.org/licenses/MIT
9
//
10
// Unless required by applicable law or agreed to in writing, software distributed
11
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
13
// specific language governing permissions and limitations under the License.
14
15
#ifndef RAPIDJSON_IEEE754_
16
#define RAPIDJSON_IEEE754_
17
18
#include "
../rapidjson.h
"
19
20
RAPIDJSON_NAMESPACE_BEGIN
21
namespace
internal
{
22
23
class
Double
{
24
public
:
25
Double
() {}
26
Double
(
double
d) :
d_
(d) {}
27
Double
(
uint64_t
u) :
u_
(u) {}
28
29
double
Value
()
const
{
return
d_
; }
30
uint64_t
Uint64Value
()
const
{
return
u_
; }
31
32
double
NextPositiveDouble
()
const
{
33
RAPIDJSON_ASSERT
(!
Sign
());
34
return
Double
(
u_
+ 1).Value();
35
}
36
37
bool
Sign
()
const
{
return
(
u_
& kSignMask) != 0; }
38
uint64_t
Significand
()
const
{
return
u_
& kSignificandMask; }
39
int
Exponent
()
const
{
return
static_cast<
int
>
(((
u_
& kExponentMask) >> kSignificandSize) - kExponentBias); }
40
41
bool
IsNan
()
const
{
return
(
u_
& kExponentMask) == kExponentMask &&
Significand
() != 0; }
42
bool
IsInf
()
const
{
return
(
u_
& kExponentMask) == kExponentMask &&
Significand
() == 0; }
43
bool
IsNanOrInf
()
const
{
return
(
u_
& kExponentMask) == kExponentMask; }
44
bool
IsNormal
()
const
{
return
(
u_
& kExponentMask) != 0 ||
Significand
() == 0; }
45
bool
IsZero
()
const
{
return
(
u_
& (kExponentMask | kSignificandMask)) == 0; }
46
47
uint64_t
IntegerSignificand
()
const
{
return
IsNormal
() ?
Significand
() | kHiddenBit :
Significand
(); }
48
int
IntegerExponent
()
const
{
return
(
IsNormal
() ?
Exponent
() : kDenormalExponent) - kSignificandSize; }
49
uint64_t
ToBias
()
const
{
return
(
u_
& kSignMask) ?
~u_
+ 1 :
u_
| kSignMask; }
50
51
static
int
EffectiveSignificandSize
(
int
order) {
52
if
(order >= -1021)
53
return
53;
54
else
if
(order <= -1074)
55
return
0;
56
else
57
return
order + 1074;
58
}
59
60
private
:
61
static
const
int
kSignificandSize = 52;
62
static
const
int
kExponentBias = 0x3FF;
63
static
const
int
kDenormalExponent = 1 - kExponentBias;
64
static
const
uint64_t
kSignMask =
RAPIDJSON_UINT64_C2
(0x80000000, 0x00000000);
65
static
const
uint64_t
kExponentMask =
RAPIDJSON_UINT64_C2
(0x7FF00000, 0x00000000);
66
static
const
uint64_t
kSignificandMask =
RAPIDJSON_UINT64_C2
(0x000FFFFF, 0xFFFFFFFF);
67
static
const
uint64_t
kHiddenBit =
RAPIDJSON_UINT64_C2
(0x00100000, 0x00000000);
68
69
union
{
70
double
d_
;
71
uint64_t
u_
;
72
};
73
};
74
75
}
// namespace internal
76
RAPIDJSON_NAMESPACE_END
77
78
#endif
// RAPIDJSON_IEEE754_
internal::Double::Uint64Value
uint64_t Uint64Value() const
Definition
ieee754.h:30
internal::Double::IntegerSignificand
uint64_t IntegerSignificand() const
Definition
ieee754.h:47
internal::Double::Double
Double(uint64_t u)
Definition
ieee754.h:27
internal::Double::IsNan
bool IsNan() const
Definition
ieee754.h:41
internal::Double::Value
double Value() const
Definition
ieee754.h:29
internal::Double::NextPositiveDouble
double NextPositiveDouble() const
Definition
ieee754.h:32
internal::Double::IsNormal
bool IsNormal() const
Definition
ieee754.h:44
internal::Double::IsNanOrInf
bool IsNanOrInf() const
Definition
ieee754.h:43
internal::Double::IsZero
bool IsZero() const
Definition
ieee754.h:45
internal::Double::IntegerExponent
int IntegerExponent() const
Definition
ieee754.h:48
internal::Double::Double
Double()
Definition
ieee754.h:25
internal::Double::d_
double d_
Definition
ieee754.h:70
internal::Double::EffectiveSignificandSize
static int EffectiveSignificandSize(int order)
Definition
ieee754.h:51
internal::Double::Sign
bool Sign() const
Definition
ieee754.h:37
internal::Double::ToBias
uint64_t ToBias() const
Definition
ieee754.h:49
internal::Double::Double
Double(double d)
Definition
ieee754.h:26
internal::Double::u_
uint64_t u_
Definition
ieee754.h:71
internal::Double::Significand
uint64_t Significand() const
Definition
ieee754.h:38
internal::Double::Exponent
int Exponent() const
Definition
ieee754.h:39
internal::Double::IsInf
bool IsInf() const
Definition
ieee754.h:42
RAPIDJSON_ASSERT
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition
rapidjson.h:411
RAPIDJSON_NAMESPACE_BEGIN
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
Definition
rapidjson.h:121
RAPIDJSON_NAMESPACE_END
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
Definition
rapidjson.h:124
internal
Definition
document.h:406
rapidjson.h
common definitions and configuration
RAPIDJSON_UINT64_C2
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
Definition
rapidjson.h:294
uint64_t
unsigned __int64 uint64_t
Definition
stdint.h:136
external
rapidjson
include
rapidjson
internal
ieee754.h
Generated on
for Electroneum by
1.17.0