Nice! Your dtoa passed my quick pseudorandom number test.
    
    
    import ./src/dtoa
    import math, parseutils, random
    
    proc test0(v: float64) =
      let s = dtoa(v)
      var v2:float64
      doAssert parseBiggestFloat(s, v2) != 0
      doAssert v2 == v
    
    proc test(v: float64) =
      test0(v)
      test0(-v)
      test0(1.0/v)
      test0(-1.0/v)
    
    proc testrand(v: float64) =
      test(v)
      for i in 0..<1000:
        let r = rand(2.0) - 1.0
        test(v*r)
    
    randomize()
    var x:float64 = 1.0
    for i in 0..<1023:
      x *= 2.0
      testrand(x)
    
    x = 1.0
    for i in 0..<1022:
      x *= 0.5
      testrand(x)
    
    for i in 0..<1000000:
      let e = rand(1022.0*2.0) - 1022
      test(pow(2.0, e))
    
    Run

Reply via email to