Differences From Artifact [4e6f6765d9]:
- File generic/tclStrToD.c — part of check-in [8a9080996d] at 2025-08-12 09:06:36 on branch c-std-update — More booleans. (user: dkf size: 142169)
To Artifact [0ab4536d6d]:
- File generic/tclStrToD.c — part of check-in [98c372af54] at 2025-08-12 14:14:15 on branch c-std-update — Yet more booleans (user: dkf size: 142171)
| ︙ | ︙ | |||
292 293 294 295 296 297 298 | }; /* * Static functions defined in this file. */ static bool AccumulateDecimalDigit(unsigned, int, | | | | | 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 | }; /* * Static functions defined in this file. */ static bool AccumulateDecimalDigit(unsigned, int, Tcl_WideUInt *, mp_int *, bool); static double MakeHighPrecisionDouble(int signum, mp_int *significand, int nSigDigs, int exponent); static double MakeLowPrecisionDouble(int signum, Tcl_WideUInt significand, int nSigDigs, int exponent); #ifdef IEEE_FLOATING_POINT static double MakeNaN(int signum, Tcl_WideUInt tag); #endif static double RefineApproximation(double approx, mp_int *exactSignificand, int exponent); static mp_err MulPow5(mp_int *, unsigned, mp_int *) MP_WUR; static int NormalizeRightward(Tcl_WideUInt *); static int RequiredPrecision(Tcl_WideUInt); static void DoubleToExpAndSig(double, Tcl_WideUInt *, int *, int *); static void TakeAbsoluteValue(Double *, int *); static char * FormatInfAndNaN(Double *, int *, char **); static char * FormatZero(int *, char **); static int ApproximateLog10(Tcl_WideUInt, int, int); static int BetterLog10(double, int, bool *); static void ComputeScale(int, int, int *, int *, int *, int *); static void SetPrecisionLimits(int, int, int *, int *, int *, int *); static char * BumpUp(char *, char *, int *); static int AdjustRange(double *, int); static char * ShorteningQuickFormat(double, int, int, double, char *, int *); static char * StrictQuickFormat(double, int, int, double, char *, int *); static char * QuickConversion(double, int, bool, int, int, int, int, int *, char **); static void CastOutPowersOf2(int *, int *, int *); static char * ShorteningInt64Conversion(Double *, Tcl_WideUInt, int, int, int, int, int, int, int, int, int, int, int, int *, char **); static char * StrictInt64Conversion(Tcl_WideUInt, int, int, int, int, int, int, |
| ︙ | ︙ | |||
1578 1579 1580 1581 1582 1583 1584 |
unsigned digit, /* Digit being scanned. */
int numZeros, /* Count of zero digits preceding the digit
* being scanned. */
Tcl_WideUInt *wideRepPtr, /* Representation of the partial number as a
* wide integer. */
mp_int *bignumRepPtr, /* Representation of the partial number as a
* bignum. */
| | | 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 |
unsigned digit, /* Digit being scanned. */
int numZeros, /* Count of zero digits preceding the digit
* being scanned. */
Tcl_WideUInt *wideRepPtr, /* Representation of the partial number as a
* wide integer. */
mp_int *bignumRepPtr, /* Representation of the partial number as a
* bignum. */
bool bignumFlag) /* True if the number overflowed previous
* to this digit. */
{
/*
* Try wide multiplication first.
*/
if (!bignumFlag) {
|
| ︙ | ︙ | |||
2575 2576 2577 2578 2579 2580 2581 |
*/
static inline int
BetterLog10(
double d, /* Original number to format. */
int k, /* Characteristic(Log base 10) of the
* number. */
| | | | | 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 |
*/
static inline int
BetterLog10(
double d, /* Original number to format. */
int k, /* Characteristic(Log base 10) of the
* number. */
bool *k_check) /* True if k is inexact. */
{
/*
* Performance hack. If k is in the range 0..TEN_PMAX, then we can use a
* powers-of-ten table to check it.
*/
if (k >= 0 && k <= TEN_PMAX) {
if (d < tens[k]) {
k--;
}
*k_check = false;
} else {
*k_check = true;
}
return k;
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ | |||
2990 2991 2992 2993 2994 2995 2996 |
*----------------------------------------------------------------------
*/
static inline char *
QuickConversion(
double e, /* Number to format. */
int k, /* floor(log10(d)), approximately. */
| | | 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 |
*----------------------------------------------------------------------
*/
static inline char *
QuickConversion(
double e, /* Number to format. */
int k, /* floor(log10(d)), approximately. */
bool k_check, /* false if k is exact, true if it may be too high */
int flags, /* Flags passed to dtoa:
* TCL_DD_SHORTEST */
int len, /* Length of the return value. */
int ilim, /* Number of digits to store. */
int ilim1, /* Number of digits to store if we misguessed
* k. */
int *decpt, /* OUTPUT: Location of the decimal point. */
|
| ︙ | ︙ | |||
3449 3450 3451 3452 3453 3454 3455 |
*/
static inline bool
ShouldBankerRoundUpToNextPowD(
mp_int *b, /* Numerator of the fraction. */
mp_int *m, /* Numerator of the rounding tolerance. */
int sd, /* Common denominator is 2**(sd*MP_DIGIT_BIT). */
| | | 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 |
*/
static inline bool
ShouldBankerRoundUpToNextPowD(
mp_int *b, /* Numerator of the fraction. */
mp_int *m, /* Numerator of the rounding tolerance. */
int sd, /* Common denominator is 2**(sd*MP_DIGIT_BIT). */
bool isodd, /* True if the integer significand is odd. */
mp_int *temp) /* Work area for the calculation. */
{
/*
* Compare B and S-m - which is the same as comparing B+m and S - which we
* do by computing b+m and doing a bitwhack compare against
* 2**(MP_DIGIT_BIT*sd)
*/
|
| ︙ | ︙ | |||
3833 3834 3835 3836 3837 3838 3839 |
*/
static inline bool
ShouldBankerRoundUp(
mp_int *twor, /* 2x the remainder from thd division that
* produced the last digit. */
mp_int *S, /* Denominator. */
| | | 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 |
*/
static inline bool
ShouldBankerRoundUp(
mp_int *twor, /* 2x the remainder from thd division that
* produced the last digit. */
mp_int *S, /* Denominator. */
bool isodd) /* True if the last digit is odd. */
{
int r = mp_cmp_mag(twor, S);
switch (r) {
case MP_EQ:
return isodd;
case MP_GT:
|
| ︙ | ︙ | |||
3867 3868 3869 3870 3871 3872 3873 |
static inline bool
ShouldBankerRoundUpToNext(
mp_int *b, /* Remainder from the division that produced
* the last digit. */
mp_int *m, /* Numerator of the rounding tolerance. */
mp_int *S, /* Denominator. */
| | | 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 |
static inline bool
ShouldBankerRoundUpToNext(
mp_int *b, /* Remainder from the division that produced
* the last digit. */
mp_int *m, /* Numerator of the rounding tolerance. */
mp_int *S, /* Denominator. */
bool isodd) /* True if the integer significand is odd. */
{
int r;
mp_int temp;
/*
* Compare b and S-m: this is the same as comparing B+m and S.
*/
|
| ︙ | ︙ | |||
4381 4382 4383 4384 4385 4386 4387 |
* one character beyond the end of the
* returned string. */
{
Double d; /* Union for deconstructing doubles. */
Tcl_WideUInt bw; /* Integer significand. */
int be; /* Power of 2 by which b must be multiplied */
int bbits; /* Number of bits needed to represent b. */
| | | | 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 |
* one character beyond the end of the
* returned string. */
{
Double d; /* Union for deconstructing doubles. */
Tcl_WideUInt bw; /* Integer significand. */
int be; /* Power of 2 by which b must be multiplied */
int bbits; /* Number of bits needed to represent b. */
bool denorm; /* True iff the input number was
* denormalized. */
int k; /* Estimate of floor(log10(d)). */
bool k_check; /* True if d is near enough to a power of
* ten that k must be checked. */
int b2, b5, s2, s5; /* Powers of 2 and 5 in the numerator and
* denominator of intermediate results. */
int ilim = -1, ilim1 = -1; /* Number of digits to convert, and number to
* convert if log10(d) has been
* overestimated. */
char *retval; /* Return value from this function. */
|
| ︙ | ︙ |