fixes issue 4212 && add test for various valid zero floats.

This commit is contained in:
Parashurama 2016-05-25 11:57:09 +02:00
commit 4716034a7f
2 changed files with 23 additions and 15 deletions

View file

@ -387,8 +387,8 @@ proc nimParseBiggestFloat(s: string, number: var BiggestFloat,
# if has no digits: return error # if has no digits: return error
if kdigits + fdigits <= 0 and if kdigits + fdigits <= 0 and
(i == start or # was only zero (i == start or # no char consumed (empty string).
has_sign) : # or only '+' or '- (i == start + 1 and has_sign)): # or only '+' or '-
return 0 return 0
if s[i] in {'e', 'E'}: if s[i] in {'e', 'E'}:

View file

@ -1,3 +1,8 @@
discard """
file: "tfloat4.nim"
output: "passed all tests."
exitcode: 0
"""
import math, strutils import math, strutils
proc c_sprintf(buf, fmt: cstring) {.importc:"sprintf", header: "<stdio.h>", varargs.} proc c_sprintf(buf, fmt: cstring) {.importc:"sprintf", header: "<stdio.h>", varargs.}
@ -11,9 +16,10 @@ proc floatToStr(f: float64): string =
return return
add(result, ch) add(result, ch)
let testFloats = [ let testFloats = [
"0", "-1", "1", "1.", ".3", "3.3", "-.3", "-99.99", "0", "-0", "0.", "0.0", "-0.", "-0.0", "-1", "1", "1.", ".3", "3.3", "-.3", "-99.99",
"1.1e10", "-2e100", "1.234e-10", "1.234e+10", "-0.0", "1.1e10", "-2e100", "1.234e-10", "1.234e+10",
"-inf", "inf", "+inf", "-inf", "inf", "+inf",
"3.14159265358979323846264338327950288", "3.14159265358979323846264338327950288",
"1.57079632679489661923132169163975144", "1.57079632679489661923132169163975144",
@ -25,18 +31,20 @@ let testFloats = [
] ]
for num in testFloats: for num in testFloats:
assert num.parseFloat.floatToStr.parseFloat == num.parseFloat doAssert num.parseFloat.floatToStr.parseFloat == num.parseFloat
assert "0".parseFloat == 0.0 doAssert "0".parseFloat == 0.0
assert "-.1".parseFloat == -0.1 doAssert "-.1".parseFloat == -0.1
assert "2.5e1".parseFloat == 25.0 doAssert "2.5e1".parseFloat == 25.0
assert "1e10".parseFloat == 10_000_000_000.0 doAssert "1e10".parseFloat == 10_000_000_000.0
assert "0.000_005".parseFloat == 5.000_000e-6 doAssert "0.000_005".parseFloat == 5.000_000e-6
assert "1.234_567e+2".parseFloat == 123.4567 doAssert "1.234_567e+2".parseFloat == 123.4567
assert "1e1_00".parseFloat == "1e100".parseFloat doAssert "1e1_00".parseFloat == "1e100".parseFloat
assert "3.1415926535897932384626433".parseFloat == doAssert "3.1415926535897932384626433".parseFloat ==
3.1415926535897932384626433 3.1415926535897932384626433
assert "2.71828182845904523536028747".parseFloat == doAssert "2.71828182845904523536028747".parseFloat ==
2.71828182845904523536028747 2.71828182845904523536028747
assert 0.00097656250000000021684043449710088680149056017398834228515625 == doAssert 0.00097656250000000021684043449710088680149056017398834228515625 ==
"0.00097656250000000021684043449710088680149056017398834228515625".parseFloat "0.00097656250000000021684043449710088680149056017398834228515625".parseFloat
echo("passed all tests.")