169 lines
2.7 KiB
V
169 lines
2.7 KiB
V
/**********************************************************************
|
||
*
|
||
* Float to string Test
|
||
*
|
||
**********************************************************************/
|
||
module ftoa
|
||
import math
|
||
|
||
union Ufloat32 {
|
||
mut:
|
||
f f32 = f32(0)
|
||
b u32
|
||
}
|
||
|
||
union Ufloat64 {
|
||
mut:
|
||
f f64 = f64(0)
|
||
b u64
|
||
}
|
||
|
||
fn f64_from_bits1(b u64) f64 {
|
||
mut x := Ufloat64{}
|
||
x.b = b
|
||
//C.printf("bin: %016llx\n",x.f)
|
||
return x.f
|
||
}
|
||
|
||
fn f32_from_bits1(b u32) f32 {
|
||
mut x := Ufloat32{}
|
||
x.b = b
|
||
//C.printf("bin: %08x\n",x.f)
|
||
return x.f
|
||
}
|
||
|
||
const(
|
||
test_cases_f32 = [
|
||
f32_from_bits1(0x0000_0000), // +0
|
||
f32_from_bits1(0x8000_0000), // -0
|
||
f32_from_bits1(0xFFC0_0001), // sNan
|
||
f32_from_bits1(0xFF80_0001), // qNan
|
||
f32_from_bits1(0x7F80_0000), // +inf
|
||
f32_from_bits1(0xFF80_0000), // -inf
|
||
1,
|
||
-1,
|
||
10,
|
||
-10,
|
||
0.3,
|
||
-0.3,
|
||
1000000,
|
||
123456.7,
|
||
123e35,
|
||
-123.45,
|
||
1e23,
|
||
f32_from_bits1(0x0080_0000), // smallest float32
|
||
math.max_f32,
|
||
383260575764816448,
|
||
]
|
||
|
||
exp_result_f32 = [
|
||
"0e+00",
|
||
"-0e+00",
|
||
"NaN",
|
||
"NaN",
|
||
"+inf",
|
||
"-inf",
|
||
"1.e+00",
|
||
"-1.e+00",
|
||
"1.e+01",
|
||
"-1.e+01",
|
||
"3.e-01",
|
||
"-3.e-01",
|
||
"1.e+06",
|
||
"1.234567e+05",
|
||
"1.23e+37",
|
||
"-1.2345e+02",
|
||
"1.e+23",
|
||
"1.1754944e-38", // aprox from 1.1754943508 × 10−38,
|
||
"3.4028235e+38",
|
||
"3.8326058e+17",
|
||
]
|
||
|
||
test_cases_f64 = [
|
||
f64_from_bits1(0x0000_0000_0000_0000), // +0
|
||
f64_from_bits1(0x8000_0000_0000_0000), // -0
|
||
f64_from_bits1(0x7FF0_0000_0000_0001), // sNan
|
||
f64_from_bits1(0x7FF8_0000_0000_0001), // qNan
|
||
f64_from_bits1(0x7FF0_0000_0000_0000), // +inf
|
||
f64_from_bits1(0xFFF0_0000_0000_0000), // -inf
|
||
1,
|
||
-1,
|
||
10,
|
||
-10,
|
||
0.3,
|
||
-0.3,
|
||
1000000,
|
||
123456.7,
|
||
123e45,
|
||
-123.45,
|
||
1e23,
|
||
f64_from_bits1(0x0010_0000_0000_0000), // smallest float64
|
||
math.max_f32,
|
||
383260575764816448,
|
||
383260575764816448,
|
||
// C failing cases
|
||
123e300,
|
||
123e-300,
|
||
5.e-324,
|
||
-5.e-324,
|
||
]
|
||
|
||
exp_result_f64 = [
|
||
"0e+00",
|
||
"-0e+00",
|
||
"NaN",
|
||
"NaN",
|
||
"+inf",
|
||
"-inf",
|
||
"1.e+00",
|
||
"-1.e+00",
|
||
"1.e+01",
|
||
"-1.e+01",
|
||
"3.e-01",
|
||
"-3.e-01",
|
||
"1.e+06",
|
||
"1.234567e+05",
|
||
"1.23e+47",
|
||
"-1.2345e+02",
|
||
"1.e+23",
|
||
"2.2250738585072014e-308",
|
||
"3.4028234663852886e+38",
|
||
"3.8326057576481645e+17",
|
||
"3.8326057576481645e+17",
|
||
|
||
"1.23e+302", // this test is failed from C sprintf!!
|
||
"1.23e-298",
|
||
"5.e-324",
|
||
"-5.e-324",
|
||
]
|
||
)
|
||
|
||
fn test_float_to_str(){
|
||
// test f32
|
||
for c,x in test_cases_f32 {
|
||
s := ftoa.f32_to_str(x,8)
|
||
s1 := exp_result_f32[c]
|
||
//println("$s1 $s")
|
||
assert s == s1
|
||
}
|
||
|
||
// test f64
|
||
for c,x in test_cases_f64 {
|
||
s := ftoa.f64_to_str(x,17)
|
||
s1 := exp_result_f64[c]
|
||
//println("$s1 $s")
|
||
assert s == s1
|
||
}
|
||
|
||
// test long format
|
||
for exp := 1 ; exp < 120 ; exp++ {
|
||
a :=ftoa.f64_to_str_l(("1e"+exp.str()).f64())
|
||
//println(a)
|
||
assert a.len == exp + 1
|
||
|
||
b :=ftoa.f64_to_str_l(("1e-"+exp.str()).f64())
|
||
//println(b)
|
||
assert b.len == exp + 2
|
||
}
|
||
}
|