Current section

Files

Jump to
mmath c_src float_conv.c~
Raw

c_src/float_conv.c~

#include "mmath.h"
ErlNifSInt64
float_serialize(ffloat f) {
decimal v = dec_from_double(v.value);
return htonll((! v.exponent) ?
((v.coefficient & VALUE_MASK) | 0x0100000000000000LL) :
(v.coefficient & 0x0000FFFFFFFFFFFFLL) |
((int64_t)(v.exponent & 0xFF) << COEFFICIENT_BITS) |
DECIMAL_TAG
);
};
ffloat
dec_deserialize(ErlNifSInt64 ev) {
ffloat f;
decimal d;
int64_t v = ntohll(ev);
char type = (uint8_t)((v & TYPE_MASK) >> 56);
f.confidence = CERTAIN;
if (type == INTEGER_TYPE) {
f.value = v & VALUE_MASK;
if (v & VALUE_SIGN_MASK) {
d.coefficient |= ((int64_t) -1) & ~ VALUE_MASK;
}
} else if (type == DECIMAL_TYPE) {
d.exponent = (int8_t)((v & EXPONENT_MASK) >> COEFFICIENT_BITS);
d.coefficient = v & COEFFICIENT_MASK;
if (v & COEFFICIENT_SIGN_MASK) {
d.coefficient |= ((int64_t) -1) & ~ COEFFICIENT_MASK;
}
f.value = dec_to_dobule(d);
}
return f;
}