VR-Vantage 2.8 API Documentation
Home
Modules
Namespaces
Classes
Files
Libraries
Examples
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
include
rapidjson
internal
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
unsigned
EffectiveSignificandSize
(
int
order
) {
52
if
(order >= -1021)
53
return
53;
54
else
if
(order <= -1074)
55
return
0;
56
else
57
return
static_cast<
unsigned
>
(
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_
Copyright © 2005-2021 MAK Technologies. All Rights Reserved (
www.mak.com
)