1. 18 8月, 2012 1 次提交
    • R
      fix float parsing logic for long decimal expansions · 11458e5b
      Rich Felker 提交于
      this affects at least the case of very long inputs, but may also
      affect shorter inputs that become long due to growth while upscaling.
      basically, the logic for the circular buffer indices of the initial
      base-10^9 digit and the slot one past the final digit, and for
      simplicity of the loop logic, assumes an invariant that they're not
      equal. the upscale loop, which can increase the length of the
      base-10^9 representation, attempted to preserve this invariant, but
      was actually only ensuring that the end index did not loop around past
      the start index, not that the two never become equal.
      
      the main (only?) effect of this bug was that subsequent logic treats
      the excessively long number as having no digits, leading to junk
      results.
      11458e5b
  2. 08 6月, 2012 1 次提交
  3. 30 4月, 2012 1 次提交
  4. 23 4月, 2012 1 次提交
  5. 22 4月, 2012 2 次提交
    • R
      make floatscan correctly set errno for overflow/underflow · 77731d0e
      Rich Felker 提交于
      care is taken that the setting of errno correctly reflects underflow
      condition. scanning exact denormal values does not result in ERANGE,
      nor does scanning values (such as the usual string definition of
      FLT_MIN) which are actually less than the smallest normal number but
      which round to a normal result.
      
      only the decimal case is handled so far; hex float require a separate
      fix to come later.
      77731d0e
    • R
      skip leading zeros even after decimal point in floatscan · 2df2a97a
      Rich Felker 提交于
      in principle this should just be an optimization, but it happens to
      also fix a nasty bug where values like 0.00000000001 were getting
      caught by the early zero detection path and wrongly scanned as zero.
      2df2a97a
  6. 21 4月, 2012 1 次提交
  7. 20 4月, 2012 1 次提交
  8. 18 4月, 2012 2 次提交
  9. 16 4月, 2012 1 次提交
    • R
      floatscan: fix incorrect count of leading nonzero digits · 2ac580fd
      Rich Felker 提交于
      this off-by-one error was causing values with just one digit past the
      decimal point to be treated by the integer case. in many cases it
      would yield the correct result, but if expressions are evaluated in
      excess precision, double rounding may occur.
      2ac580fd
  10. 12 4月, 2012 7 次提交
    • R
      remove magic numbers from floatscan · 3ddeedd8
      Rich Felker 提交于
      3ddeedd8
    • R
    • R
      revert invalid optimization in floatscan · 470fecdd
      Rich Felker 提交于
      470fecdd
    • R
    • R
      optimize floatscan downscaler to skip results that won't be needed · 4054da9b
      Rich Felker 提交于
      when upscaling, even the very last digit is needed in cases where the
      input is exact; no digits can be discarded. but when downscaling, any
      digits less significant than the mantissa bits are destined for the
      great bitbucket; the only influence they can have is their presence
      (being nonzero). thus, we simply throw them away early. the result is
      nearly a 4x performance improvement for processing huge values.
      
      the particular threshold LD_B1B_DIG+3 is not chosen sharply; it's
      simply a "safe" distance past the significant bits. it would be nice
      to replace it with a sharp bound, but i suspect performance will be
      comparable (within a few percent) anyway.
      4054da9b
    • R
      simplify/debloat radix point alignment code in floatscan · 5837a0bb
      Rich Felker 提交于
      now that this is the first operation, it can rely on the circular
      buffer contents not being wrapped when it begins. we limit the number
      of digits read slightly in the initial parsing loops too so that this
      code does not have to consider the case where it might cause the
      circular buffer to wrap; this is perfectly fine because KMAX is chosen
      as a power of two for circular-buffer purposes and is much larger than
      it otherwise needs to be, anyway.
      
      these changes should not affect performance at all.
      5837a0bb
    • R
      optimize floatscan: avoid excessive upscaling · 1bdd5c8b
      Rich Felker 提交于
      upscaling by even one step too much creates 3-29 extra iterations for
      the next loop. this is still suboptimal since it always goes by 2^29
      rather than using a smaller upscale factor when nearing the target,
      but performance on common, small-magnitude, few-digit values has
      already more than doubled with this change.
      
      more optimizations on the way...
      1bdd5c8b
  11. 11 4月, 2012 5 次提交
    • R
    • R
      fix float scanning of certain values ending in zeros · 38b3f1fe
      Rich Felker 提交于
      for example, "1000000000" was being read as "1" due to this loop
      exiting early. it's necessary to actually update z and zero the
      entries so that the subsequent rounding code does not get confused;
      before i did that, spurious inexact exceptions were being raised.
      38b3f1fe
    • R
      fix potential overflow in exponent reading · 633a26c1
      Rich Felker 提交于
      note that there's no need for a precise cutoff, because exponents this
      large will always result in overflow or underflow (it's impossible to
      read enough digits to compensate for the exponent magnitude; even at a
      few nanoseconds per digit it would take hundreds of years).
      633a26c1
    • R
      set errno properly when parsing floating point · c5ff2969
      Rich Felker 提交于
      c5ff2969
    • R
      add "scan helper getc" and rework strtod, etc. to use it · 2162541f
      Rich Felker 提交于
      the immediate benefit is a significant debloating of the float parsing
      code by moving the responsibility for keeping track of the number of
      characters read to a different module.
      
      by linking shgetc with the stdio buffer logic, counting logic is
      defered to buffer refill time, keeping the calls to shgetc fast and
      light.
      
      in the future, shgetc will also be useful for integrating the new
      float code with scanf, which needs to not only count the characters
      consumed, but also limit the number of characters read based on field
      width specifiers.
      
      shgetc may also become a useful tool for simplifying the integer
      parsing code.
      2162541f
  12. 10 4月, 2012 1 次提交
    • R
      new floating point parser/converter · 415c4cd7
      Rich Felker 提交于
      this version is intended to be fully conformant to the ISO C, POSIX,
      and IEEE standards for conversion of decimal/hex floating point
      strings to float, double, and long double (ld64 or ld80 only at
      present) values. in particular, all results are intended to be rounded
      correctly according to the current rounding mode. further, this
      implementation aims to set the floating point underflow, overflow, and
      inexact flags to reflect the conversion performed.
      
      a moderate amount of testing has been performed (by nsz and myself)
      prior to integration of the code in musl, but it still may have bugs.
      
      so far, only strto(d|ld|f) use the new code. scanf integration will be
      done as a separate commit, and i will add implementations of the wide
      character functions later.
      415c4cd7