|
|
@@ -199,7 +199,7 @@ template<> real::Real(char const *str) |
|
|
|
{ |
|
|
|
real ret = 0; |
|
|
|
int exponent = 0; |
|
|
|
bool comma = false, nonzero = false, negative = false, finished = false; |
|
|
|
bool hex = false, comma = false, nonzero = false, negative = false, finished = false; |
|
|
|
|
|
|
|
for (char const *p = str; *p && !finished; p++) |
|
|
|
{ |
|
|
@@ -216,26 +216,50 @@ template<> real::Real(char const *str) |
|
|
|
finished = true; |
|
|
|
comma = true; |
|
|
|
break; |
|
|
|
case 'x': |
|
|
|
case 'X': |
|
|
|
/* This character is only valid for 0x... and 0X... numbers */ |
|
|
|
if (p != str + 1 || str[0] != '0') |
|
|
|
finished = true; |
|
|
|
hex = true; |
|
|
|
break; |
|
|
|
case 'p': |
|
|
|
case 'P': |
|
|
|
if (hex) |
|
|
|
exponent += atoi(p + 1); |
|
|
|
finished = true; |
|
|
|
break; |
|
|
|
case 'e': |
|
|
|
case 'E': |
|
|
|
if (!hex) |
|
|
|
{ |
|
|
|
exponent += atoi(p + 1); |
|
|
|
finished = true; |
|
|
|
break; |
|
|
|
} |
|
|
|
case 'a': case 'b': case 'c': case 'd': case 'f': |
|
|
|
case 'A': case 'B': case 'C': case 'D': case 'F': |
|
|
|
case '0': case '1': case '2': case '3': case '4': |
|
|
|
case '5': case '6': case '7': case '8': case '9': |
|
|
|
if (nonzero) |
|
|
|
{ |
|
|
|
real x = ret + ret; |
|
|
|
x = x + x + ret; |
|
|
|
ret = x + x; |
|
|
|
/* Multiply ret by 10 or 16 depending the base. */ |
|
|
|
if (!hex) |
|
|
|
{ |
|
|
|
real x = ret + ret; |
|
|
|
ret = x + x + ret; |
|
|
|
} |
|
|
|
ret.m_signexp += hex ? 4 : 1; |
|
|
|
} |
|
|
|
if (*p != '0') |
|
|
|
{ |
|
|
|
ret += (int)(*p - '0'); |
|
|
|
ret += (*p >= 'a' && *p <= 'f') ? (int)(*p - 'a' + 10) |
|
|
|
: (*p >= 'A' && *p <= 'F') ? (int)(*p - 'A' + 10) |
|
|
|
: (int)(*p - '0'); |
|
|
|
nonzero = true; |
|
|
|
} |
|
|
|
if (comma) |
|
|
|
exponent--; |
|
|
|
break; |
|
|
|
case 'e': |
|
|
|
case 'E': |
|
|
|
exponent += atoi(p + 1); |
|
|
|
finished = true; |
|
|
|
exponent -= hex ? 4 : 1; |
|
|
|
break; |
|
|
|
default: |
|
|
|
finished = true; |
|
|
@@ -243,7 +267,9 @@ template<> real::Real(char const *str) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (exponent) |
|
|
|
if (hex) |
|
|
|
ret.m_signexp += exponent; |
|
|
|
else if (exponent) |
|
|
|
ret *= pow(R_10(), (real)exponent); |
|
|
|
|
|
|
|
if (negative) |
|
|
@@ -1428,7 +1454,7 @@ template<> void real::sprintf(char *str, int ndigits) const |
|
|
|
/* Normalise x so that mantissa is in [1..9.999] */ |
|
|
|
/* FIXME: better use int64_t when the cast is implemented */ |
|
|
|
int exponent = ceil(log10(x)); |
|
|
|
x /= pow(R_10(), (real)exponent); |
|
|
|
x *= pow(R_10(), -(real)exponent); |
|
|
|
|
|
|
|
if (x < R_1()) |
|
|
|
{ |
|
|
|