aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/strconv/f32_f64_to_string_test.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/vlib/strconv/f32_f64_to_string_test.v')
-rw-r--r--v_windows/v/vlib/strconv/f32_f64_to_string_test.v171
1 files changed, 171 insertions, 0 deletions
diff --git a/v_windows/v/vlib/strconv/f32_f64_to_string_test.v b/v_windows/v/vlib/strconv/f32_f64_to_string_test.v
new file mode 100644
index 0000000..0b24aa2
--- /dev/null
+++ b/v_windows/v/vlib/strconv/f32_f64_to_string_test.v
@@ -0,0 +1,171 @@
+/**********************************************************************
+*
+* Float to string Test
+*
+**********************************************************************/
+import strconv
+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 unsafe { x.f }
+}
+
+fn f32_from_bits1(b u32) f32 {
+ mut x := Ufloat32{}
+ x.b = b
+ // C.printf("bin: %08x\n",x.f)
+ return unsafe { x.f }
+}
+
+fn test_float_to_str() {
+ 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.0,
+ ]
+
+ 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',
+ ]
+
+ // test f32
+ for c, x in test_cases_f32 {
+ println(x)
+ s := strconv.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 := strconv.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 := strconv.f64_to_str_l(('1e' + exp.str()).f64())
+ // println(a)
+ assert a.len == exp + 1
+
+ b := strconv.f64_to_str_l(('1e-' + exp.str()).f64())
+ // println(b)
+ assert b.len == exp + 2
+ }
+
+ // test rounding str conversion
+ // println( ftoa.f64_to_str(0.3456789123456, 4) )
+ // assert ftoa.f64_to_str(0.3456789123456, 4)=="3.4568e-01"
+ // assert ftoa.f32_to_str(0.345678, 3)=="3.457e-01"
+}