Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 18 additions & 6 deletions ffi/src/ffi/extra/json_parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -298,26 +298,38 @@ class JSONParserContext {
private:
static double FastMathSafePosInf() {
#ifdef __FAST_MATH__
const uint64_t inf_bits = 0x7FF0000000000000ULL;
return *reinterpret_cast<const double*>(&inf_bits);
union {
uint64_t from;
double to;
} u;
u.from = 0x7FF0000000000000ULL; // write "from", read "to"
return u.to;
#else
return std::numeric_limits<double>::infinity();
#endif
}

static double FastMathSafeNegInf() {
#ifdef __FAST_MATH__
const uint64_t inf_bits = 0xFFF0000000000000ULL;
return *reinterpret_cast<const double*>(&inf_bits);
union {
uint64_t from;
double to;
} u;
u.from = 0xFFF0000000000000ULL; // write "from", read "to"
return u.to;
#else
return -std::numeric_limits<double>::infinity();
#endif
}

static double FastMathSafeNaN() {
#ifdef __FAST_MATH__
const uint64_t nan_bits = 0x7FF8000000000000ULL;
return *reinterpret_cast<const double*>(&nan_bits);
union {
uint64_t from;
double to;
} u;
u.from = 0x7FF8000000000000ULL; // write "from", read "to"
return u.to;
#else
return std::numeric_limits<double>::quiet_NaN();
#endif
Expand Down
14 changes: 12 additions & 2 deletions ffi/src/ffi/extra/json_writer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,12 @@ class JSONWriter {
// IEEE 754 standard: https://en.wikipedia.org/wiki/IEEE_754
// NaN is encoded as all 1s in the exponent and non-zero in the mantissa
static_assert(sizeof(double) == sizeof(uint64_t), "Unexpected double size");
uint64_t bits = *reinterpret_cast<const uint64_t*>(&x);
union {
double from;
uint64_t to;
} u;
u.from = x; // write "from", read "to"
uint64_t bits = u.to;
uint64_t exponent = (bits >> 52) & 0x7FF;
uint64_t mantissa = bits & 0xFFFFFFFFFFFFFull;
return (exponent == 0x7FF) && (mantissa != 0);
Expand All @@ -81,7 +86,12 @@ class JSONWriter {
// IEEE 754 standard: https://en.wikipedia.org/wiki/IEEE_754
// Inf is encoded as all 1s in the exponent and zero in the mantissa
static_assert(sizeof(double) == sizeof(uint64_t), "Unexpected double size");
uint64_t bits = *reinterpret_cast<const uint64_t*>(&x);
union {
double from;
uint64_t to;
} u;
u.from = x; // write "from", read "to"
uint64_t bits = u.to;
uint64_t exponent = (bits >> 52) & 0x7FF;
uint64_t mantissa = bits & 0xFFFFFFFFFFFFFull;
// inf is encoded as all 1s in the exponent and zero in the mantissa
Expand Down
Loading