Files
Nim/tests/float/tfloats.nim
Timothee Cour c871e22da2 fix #7717 roundtrip float to string; fix parseFloat for js (#18248)
* refs #7717 roundtrip float to string
* make parseFloat more correct
* improve float tests
* improve float tests
* cleanup
2021-06-13 07:32:47 +02:00

85 lines
1.8 KiB
Nim

discard """
targets: "c cpp js"
"""
# disabled: "windows"
#[
xxx merge all or most float tests into this file
]#
import std/[fenv, math, strutils]
proc equalsOrNaNs(a, b: float): bool =
if isNaN(a): isNaN(b)
elif a == 0:
b == 0 and signbit(a) == signbit(b)
else:
a == b
template reject(a) =
doAssertRaises(ValueError): discard parseFloat(a)
template main =
block:
proc test(a: string, b: float) =
let a2 = a.parseFloat
doAssert equalsOrNaNs(a2, b), $(a, a2, b)
test "0.00_0001", 1E-6
test "0.00__00_01", 1E-6
test "0.0_01", 0.001
test "0.00_000_1", 1E-6
test "0.00000_1", 1E-6
test "1_0.00_0001", 10.000001
test "1__00.00_0001", 1_00.000001
test "inf", Inf
test "-inf", -Inf
test "-Inf", -Inf
test "-INF", -Inf
test "NaN", NaN
test "-nan", NaN
test ".1", 0.1
test "-.1", -0.1
test "-0", -0.0
when false: # pending bug #18246
test "-0", -0.0
test ".1e-1", 0.1e-1
test "0_1_2_3.0_1_2_3E+0_1_2", 123.0123e12
test "0_1_2.e-0", 12e0
test "0_1_2e-0", 12e0
test "-0e0", -0.0
test "-0e-0", -0.0
reject "a"
reject ""
reject "e1"
reject "infa"
reject "infe1"
reject "_"
reject "1e"
when false: # gray area; these numbers should probably be invalid
reject "1_"
reject "1_.0"
reject "1.0_"
block: # bug #18148
var a = 1.1'f32
doAssert $a == "1.1", $a # was failing
block: # bug #7717
proc test(f: float) =
let f2 = $f
let f3 = parseFloat(f2)
doAssert equalsOrNaNs(f, f3), $(f, f2, f3)
test 1.0 + epsilon(float64)
test 1000000.0000000123
test log2(100000.0)
test maximumPositiveValue(float32)
test maximumPositiveValue(float64)
test minimumPositiveValue(float32)
test minimumPositiveValue(float64)
static: main()
main()