mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-20 06:20:38 +00:00
* refs #7717 roundtrip float to string * make parseFloat more correct * improve float tests * improve float tests * cleanup
This commit is contained in:
@@ -1,28 +0,0 @@
|
||||
discard """
|
||||
output: '''
|
||||
0.000001 : 0.000001
|
||||
0.000001 : 0.000001
|
||||
0.001 : 0.001
|
||||
0.000001 : 0.000001
|
||||
0.000001 : 0.000001
|
||||
10.000001 : 10.000001
|
||||
100.000001 : 100.000001
|
||||
'''
|
||||
disabled: "windows"
|
||||
"""
|
||||
|
||||
import strutils
|
||||
|
||||
echo "0.00_0001".parseFloat(), " : ", 1E-6
|
||||
echo "0.00__00_01".parseFloat(), " : ", 1E-6
|
||||
echo "0.0_01".parseFloat(), " : ", 0.001
|
||||
echo "0.00_000_1".parseFloat(), " : ", 1E-6
|
||||
echo "0.00000_1".parseFloat(), " : ", 1E-6
|
||||
|
||||
echo "1_0.00_0001".parseFloat(), " : ", 10.000001
|
||||
echo "1__00.00_0001".parseFloat(), " : ", 1_00.000001
|
||||
|
||||
# bug #18148
|
||||
|
||||
var a = 1.1'f32
|
||||
doAssert $a == "1.1", $a # fails
|
||||
84
tests/float/tfloats.nim
Normal file
84
tests/float/tfloats.nim
Normal file
@@ -0,0 +1,84 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user