Preserve numerical precision on length/0 (#3275)

This commit is contained in:
itchyny authored and GitHub committed 2025-03-04 22:09:33 +09:00
1 parent 17be97a8ad
commit b7a1201b72
4 files changed
+30 -2

No files matched your search

+1 -1
View File
@@ -497,7 +497,7 @@ static jv f_length(jq_state *jq, jv input) {
} else if (jv_get_kind(input) == JV_KIND_STRING) {
return jv_number(jv_string_length_codepoints(input));
} else if (jv_get_kind(input) == JV_KIND_NUMBER) {
jv r = jv_number(fabs(jv_number_value(input)));
jv r = jv_number_abs(input);
jv_free(input);
return r;
} else if (jv_get_kind(input) == JV_KIND_NULL) {
+15
View File
@@ -732,6 +732,21 @@ int jvp_number_is_nan(jv n) {
return isnan(n.u.number);
}
jv jv_number_abs(jv n) {
assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
#ifdef USE_DECNUM
if (JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL)) {
jvp_literal_number* m = jvp_literal_number_alloc(jvp_dec_number_ptr(n)->digits);
decNumberAbs(&m->num_decimal, jvp_dec_number_ptr(n), DEC_CONTEXT());
jv r = {JVP_FLAGS_NUMBER_LITERAL, 0, 0, 0, {&m->refcnt}};
return r;
}
#endif
return jv_number(fabs(jv_number_value(n)));
}
jv jv_number_negate(jv n) {
assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
+1
View File
@@ -74,6 +74,7 @@ jv jv_number(double);
jv jv_number_with_literal(const char*);
double jv_number_value(jv);
int jv_is_integer(jv);
jv jv_number_abs(jv);
jv jv_number_negate(jv);
int jv_number_has_literal(jv);