fix inexact number printing when LC_NUMERIC locale is not "C"
Relevant to PR 11802
This commit is contained in:
parent
0101d12d49
commit
5d481c259b
|
@ -1569,7 +1569,9 @@ static char *double_to_string (double d, int alloc, int was_single)
|
||||||
/* Initial count for significant digits is 14. That's big enough to
|
/* Initial count for significant digits is 14. That's big enough to
|
||||||
get most right, small enough to avoid nonsense digits. But we'll
|
get most right, small enough to avoid nonsense digits. But we'll
|
||||||
loop in case it's not precise enough to get read-write invariance: */
|
loop in case it's not precise enough to get read-write invariance: */
|
||||||
|
GC_CAN_IGNORE char *loc;
|
||||||
digits = 14;
|
digits = 14;
|
||||||
|
loc = scheme_push_c_numeric_locale();
|
||||||
while (digits < 30) {
|
while (digits < 30) {
|
||||||
double check;
|
double check;
|
||||||
GC_CAN_IGNORE char *ptr;
|
GC_CAN_IGNORE char *ptr;
|
||||||
|
@ -1583,6 +1585,7 @@ static char *double_to_string (double d, int alloc, int was_single)
|
||||||
|
|
||||||
digits++;
|
digits++;
|
||||||
}
|
}
|
||||||
|
scheme_pop_c_numeric_locale(loc);
|
||||||
|
|
||||||
l = strlen(buffer);
|
l = strlen(buffer);
|
||||||
for (i = 0; i < l; i++) {
|
for (i = 0; i < l; i++) {
|
||||||
|
|
|
@ -1693,6 +1693,9 @@ void scheme_clear_bignum_cache(void);
|
||||||
|
|
||||||
intptr_t scheme_integer_length(Scheme_Object *n);
|
intptr_t scheme_integer_length(Scheme_Object *n);
|
||||||
|
|
||||||
|
char *scheme_push_c_numeric_locale();
|
||||||
|
void scheme_pop_c_numeric_locale(char *prev);
|
||||||
|
|
||||||
/****** Rational numbers *******/
|
/****** Rational numbers *******/
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -3508,6 +3508,26 @@ static void reset_locale(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *scheme_push_c_numeric_locale()
|
||||||
|
{
|
||||||
|
#ifndef DONT_USE_LOCALE
|
||||||
|
GC_CAN_IGNORE char *prev;
|
||||||
|
prev = setlocale(LC_NUMERIC, NULL);
|
||||||
|
if (!strcmp(prev, "C"))
|
||||||
|
return NULL;
|
||||||
|
else
|
||||||
|
return setlocale(LC_NUMERIC, "C");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void scheme_pop_c_numeric_locale(char *prev)
|
||||||
|
{
|
||||||
|
#ifndef DONT_USE_LOCALE
|
||||||
|
if (prev)
|
||||||
|
setlocale(LC_NUMERIC, prev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static int find_special_casing(int ch)
|
static int find_special_casing(int ch)
|
||||||
{
|
{
|
||||||
/* Binary search */
|
/* Binary search */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user