Improve USE_DECNUM check position
This commit is contained in:
1 parent
54fef09ac3
commit
c4d5ba954d
1 file changed
+50
-43
@@ -48,11 +48,6 @@
|
|||||||
|
|
||||||
#include "jv_dtoa.h"
|
#include "jv_dtoa.h"
|
||||||
#include "jv_dtoa_tsd.h"
|
#include "jv_dtoa_tsd.h"
|
||||||
|
|
||||||
// this means that we will manage the space for the struct
|
|
||||||
#define DECNUMDIGITS 1
|
|
||||||
#include "decNumber/decNumber.h"
|
|
||||||
|
|
||||||
#include "jv_type_private.h"
|
#include "jv_type_private.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -204,6 +199,11 @@ static void jvp_invalid_free(jv x) {
|
|||||||
* Numbers
|
* Numbers
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef USE_DECNUM
|
||||||
|
// we will manage the space for the struct
|
||||||
|
#define DECNUMDIGITS 1
|
||||||
|
#include "decNumber/decNumber.h"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
JVP_NUMBER_NATIVE = 0,
|
JVP_NUMBER_NATIVE = 0,
|
||||||
JVP_NUMBER_DECIMAL = 1
|
JVP_NUMBER_DECIMAL = 1
|
||||||
@@ -213,7 +213,6 @@ enum {
|
|||||||
#define JV_NUMBER_SIZE_CONVERTED (1)
|
#define JV_NUMBER_SIZE_CONVERTED (1)
|
||||||
|
|
||||||
#define JVP_FLAGS_NUMBER_NATIVE JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_NATIVE, 0))
|
#define JVP_FLAGS_NUMBER_NATIVE JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_NATIVE, 0))
|
||||||
#define JVP_FLAGS_NUMBER_NATIVE_STR JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_NATIVE, 1))
|
|
||||||
#define JVP_FLAGS_NUMBER_LITERAL JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_DECIMAL, 1))
|
#define JVP_FLAGS_NUMBER_LITERAL JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_DECIMAL, 1))
|
||||||
|
|
||||||
// the decimal precision of binary double
|
// the decimal precision of binary double
|
||||||
@@ -629,10 +628,10 @@ static double jvp_literal_number_to_double(jv j) {
|
|||||||
|
|
||||||
decNumber *p_dec_number = jvp_dec_number_ptr(j);
|
decNumber *p_dec_number = jvp_dec_number_ptr(j);
|
||||||
decNumberDoublePrecision dec_double;
|
decNumberDoublePrecision dec_double;
|
||||||
char literal[BIN64_DEC_PRECISION + DEC_NUMBER_STRING_GUARD + 1];
|
char literal[BIN64_DEC_PRECISION + DEC_NUMBER_STRING_GUARD + 1];
|
||||||
|
|
||||||
// reduce the number to the shortest possible form
|
// reduce the number to the shortest possible form
|
||||||
// while also making sure than no more than BIN64_DEC_PRECISION
|
// while also making sure than no more than BIN64_DEC_PRECISION
|
||||||
// digits are used (dec_context_to_double)
|
// digits are used (dec_context_to_double)
|
||||||
decNumberReduce(&dec_double.number, p_dec_number, DEC_CONTEXT_TO_DOUBLE());
|
decNumberReduce(&dec_double.number, p_dec_number, DEC_CONTEXT_TO_DOUBLE());
|
||||||
|
|
||||||
@@ -642,11 +641,6 @@ static double jvp_literal_number_to_double(jv j) {
|
|||||||
return jvp_strtod(tsd_dtoa_context_get(), literal, &end);
|
return jvp_strtod(tsd_dtoa_context_get(), literal, &end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int jvp_number_equal(jv a, jv b) {
|
|
||||||
return jvp_number_cmp(a, b) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char* jvp_literal_number_literal(jv n) {
|
static const char* jvp_literal_number_literal(jv n) {
|
||||||
assert(JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL));
|
assert(JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL));
|
||||||
decNumber *pdec = jvp_dec_number_ptr(n);
|
decNumber *pdec = jvp_dec_number_ptr(n);
|
||||||
@@ -671,7 +665,7 @@ static const char* jvp_literal_number_literal(jv n) {
|
|||||||
|
|
||||||
// Preserve the actual precision as we have parsed it
|
// Preserve the actual precision as we have parsed it
|
||||||
// don't do decNumberTrim(pdec);
|
// don't do decNumberTrim(pdec);
|
||||||
|
|
||||||
decNumberToString(pdec, plit->literal_data);
|
decNumberToString(pdec, plit->literal_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -693,8 +687,26 @@ const char* jv_number_get_literal(jv n) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jv jv_number_with_literal(const char * literal) {
|
||||||
|
return jvp_literal_number_new(literal);
|
||||||
|
}
|
||||||
|
#endif /* USE_DECNUM */
|
||||||
|
|
||||||
|
jv jv_number(double x) {
|
||||||
|
jv j = {
|
||||||
|
#ifdef USE_DECNUM
|
||||||
|
JVP_FLAGS_NUMBER_NATIVE,
|
||||||
|
#else
|
||||||
|
JV_KIND_NUMBER,
|
||||||
|
#endif
|
||||||
|
0, 0, 0, {.number = x}
|
||||||
|
};
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
|
||||||
static void jvp_number_free(jv j) {
|
static void jvp_number_free(jv j) {
|
||||||
assert(JVP_HAS_KIND(j, JV_KIND_NUMBER));
|
assert(JVP_HAS_KIND(j, JV_KIND_NUMBER));
|
||||||
|
#ifdef USE_DECNUM
|
||||||
if (JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL) && jvp_refcnt_dec(j.u.ptr)) {
|
if (JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL) && jvp_refcnt_dec(j.u.ptr)) {
|
||||||
jvp_literal_number* n = jvp_literal_number_ptr(j);
|
jvp_literal_number* n = jvp_literal_number_ptr(j);
|
||||||
if (n->literal_data) {
|
if (n->literal_data) {
|
||||||
@@ -702,15 +714,7 @@ static void jvp_number_free(jv j) {
|
|||||||
}
|
}
|
||||||
jv_mem_free(n);
|
jv_mem_free(n);
|
||||||
}
|
}
|
||||||
}
|
#endif
|
||||||
|
|
||||||
jv jv_number_with_literal(const char * literal) {
|
|
||||||
return jvp_literal_number_new(literal);
|
|
||||||
}
|
|
||||||
|
|
||||||
jv jv_number(double x) {
|
|
||||||
jv j = {JVP_FLAGS_NUMBER_NATIVE, 0, 0, 0, {.number = x}};
|
|
||||||
return j;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double jv_number_value(jv j) {
|
double jv_number_value(jv j) {
|
||||||
@@ -725,16 +729,13 @@ double jv_number_value(jv j) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return n->num_double;
|
return n->num_double;
|
||||||
} else {
|
|
||||||
#endif
|
|
||||||
return j.u.number;
|
|
||||||
#ifdef USE_DECNUM
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
return j.u.number;
|
||||||
}
|
}
|
||||||
|
|
||||||
int jv_is_integer(jv j){
|
int jv_is_integer(jv j){
|
||||||
if(!JVP_HAS_KIND(j, JV_KIND_NUMBER)){
|
if (!JVP_HAS_KIND(j, JV_KIND_NUMBER)){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -749,22 +750,24 @@ int jv_is_integer(jv j){
|
|||||||
int jvp_number_is_nan(jv n) {
|
int jvp_number_is_nan(jv n) {
|
||||||
assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
|
assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
|
||||||
|
|
||||||
|
#ifdef USE_DECNUM
|
||||||
if (JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL)) {
|
if (JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL)) {
|
||||||
decNumber *pdec = jvp_dec_number_ptr(n);
|
decNumber *pdec = jvp_dec_number_ptr(n);
|
||||||
return decNumberIsNaN(pdec);
|
return decNumberIsNaN(pdec);
|
||||||
} else {
|
|
||||||
return n.u.number != n.u.number;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
return n.u.number != n.u.number;
|
||||||
}
|
}
|
||||||
|
|
||||||
int jvp_number_cmp(jv a, jv b) {
|
int jvp_number_cmp(jv a, jv b) {
|
||||||
assert(JVP_HAS_KIND(a, JV_KIND_NUMBER));
|
assert(JVP_HAS_KIND(a, JV_KIND_NUMBER));
|
||||||
assert(JVP_HAS_KIND(b, JV_KIND_NUMBER));
|
assert(JVP_HAS_KIND(b, JV_KIND_NUMBER));
|
||||||
|
|
||||||
if(JVP_HAS_FLAGS(a, JVP_FLAGS_NUMBER_LITERAL) && JVP_HAS_FLAGS(b, JVP_FLAGS_NUMBER_LITERAL)) {
|
#ifdef USE_DECNUM
|
||||||
decNumberSingle res;
|
if (JVP_HAS_FLAGS(a, JVP_FLAGS_NUMBER_LITERAL) && JVP_HAS_FLAGS(b, JVP_FLAGS_NUMBER_LITERAL)) {
|
||||||
decNumberCompare(&res.number,
|
decNumberSingle res;
|
||||||
jvp_dec_number_ptr(a),
|
decNumberCompare(&res.number,
|
||||||
|
jvp_dec_number_ptr(a),
|
||||||
jvp_dec_number_ptr(b),
|
jvp_dec_number_ptr(b),
|
||||||
DEC_CONTEXT()
|
DEC_CONTEXT()
|
||||||
);
|
);
|
||||||
@@ -775,16 +778,20 @@ int jvp_number_cmp(jv a, jv b) {
|
|||||||
} else {
|
} else {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
double da = jv_number_value(a), db = jv_number_value(b);
|
|
||||||
if (da < db) {
|
|
||||||
return -1;
|
|
||||||
} else if (da == db) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
double da = jv_number_value(a), db = jv_number_value(b);
|
||||||
|
if (da < db) {
|
||||||
|
return -1;
|
||||||
|
} else if (da == db) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jvp_number_equal(jv a, jv b) {
|
||||||
|
return jvp_number_cmp(a, b) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in new issue
Block a user