use warnings; use strict; use Data::IEEE754::Tools qw(to_hex_floatingpoint to_dec_floatingpoint nextUp nextDown); use 5.022; # for %a printf "%-6.6s %30.30s %30.30s %30.30s %30.30s %30.30s\n", 'approx', '%30.16f', '%30.16e', '%a', 'to_hex_floatingpoint()', 'to_dec_floatingpoint()'; foreach my $v ( map { $_ / 10. } 0 .. 100, 1280, 10240) { # 0 .. 10, 128, 1024 my $d = nextDown($v); my $u = nextUp($v); printf "%-6.1f-ULP %30.16f %30.16e %30.13a %30.30s %30.30s\n", $v, $d, $d, $d, to_hex_floatingpoint($d), to_dec_floatingpoint($d); printf "%-6.1f %30.16f %30.16e %30.13a %30.30s %30.30s\n", $v, $v, $v, $v, to_hex_floatingpoint($v), to_dec_floatingpoint($v); printf "%-6.1f+ULP %30.16f %30.16e %30.13a %30.30s %30.30s\n", $v, $u, $u, $u, to_hex_floatingpoint($u), to_dec_floatingpoint($u); print "\n"; } printf "%-6.6s %30.30s %30.30s %30.30s %30.30s %30.30s\n", 'approx', '%30.16f', '%30.16e', '%a', 'to_hex_floatingpoint()', 'to_dec_floatingpoint()'; #### approx %30.16f %30.16e %a to_hex_floatingpoint() to_dec_floatingpoint() ... 0.4 -ULP 0.4000000000000000 3.9999999999999997e-001 0x1.9999999999999p-2 +0x1.9999999999999p-0002 +0d1.5999999999999999p-0002 0.4 0.4000000000000000 4.0000000000000002e-001 0x1.999999999999ap-2 +0x1.999999999999ap-0002 +0d1.6000000000000001p-0002 0.4 +ULP 0.4000000000000001 4.0000000000000008e-001 0x1.999999999999bp-2 +0x1.999999999999bp-0002 +0d1.6000000000000003p-0002 #### 0.5 -ULP 0.4999999999999999 4.9999999999999994e-001 0x1.fffffffffffffp-2 +0x1.fffffffffffffp-0002 +0d1.9999999999999998p-0002 0.5 0.5000000000000000 5.0000000000000000e-001 0x1.0000000000000p-1 +0x1.0000000000000p-0001 +0d1.0000000000000000p-0001 0.5 +ULP 0.5000000000000001 5.0000000000000011e-001 0x1.0000000000001p-1 +0x1.0000000000001p-0001 +0d1.0000000000000002p-0001 #### ... 4.0 -ULP 3.9999999999999996 3.9999999999999996e+000 0x1.fffffffffffffp+1 +0x1.fffffffffffffp+0001 +0d1.9999999999999998p+0001 4.0 4.0000000000000000 4.0000000000000000e+000 0x1.0000000000000p+2 +0x1.0000000000000p+0002 +0d1.0000000000000000p+0002 4.0 +ULP 4.0000000000000009 4.0000000000000009e+000 0x1.0000000000001p+2 +0x1.0000000000001p+0002 +0d1.0000000000000002p+0002 4.1 -ULP 4.0999999999999988 4.0999999999999988e+000 0x1.0666666666665p+2 +0x1.0666666666665p+0002 +0d1.0249999999999997p+0002 4.1 4.0999999999999996 4.0999999999999996e+000 0x1.0666666666666p+2 +0x1.0666666666666p+0002 +0d1.0249999999999999p+0002 4.1 +ULP 4.1000000000000005 4.1000000000000005e+000 0x1.0666666666667p+2 +0x1.0666666666667p+0002 +0d1.0250000000000001p+0002 #### ... 10.0 -ULP 9.9999999999999982 9.9999999999999982e+000 0x1.3ffffffffffffp+3 +0x1.3ffffffffffffp+0003 +0d1.2499999999999998p+0003 10.0 10.0000000000000000 1.0000000000000000e+001 0x1.4000000000000p+3 +0x1.4000000000000p+0003 +0d1.2500000000000000p+0003 10.0 +ULP 10.0000000000000020 1.0000000000000002e+001 0x1.4000000000001p+3 +0x1.4000000000001p+0003 +0d1.2500000000000002p+0003 128.0 -ULP 127.9999999999999900 1.2799999999999999e+002 0x1.fffffffffffffp+6 +0x1.fffffffffffffp+0006 +0d1.9999999999999998p+0006 128.0 128.0000000000000000 1.2800000000000000e+002 0x1.0000000000000p+7 +0x1.0000000000000p+0007 +0d1.0000000000000000p+0007 128.0 +ULP 128.0000000000000300 1.2800000000000003e+002 0x1.0000000000001p+7 +0x1.0000000000001p+0007 +0d1.0000000000000002p+0007 1024.0-ULP 1023.9999999999999000 1.0239999999999999e+003 0x1.fffffffffffffp+9 +0x1.fffffffffffffp+0009 +0d1.9999999999999998p+0009 1024.0 1024.0000000000000000 1.0240000000000000e+003 0x1.0000000000000p+10 +0x1.0000000000000p+0010 +0d1.0000000000000000p+0010 1024.0+ULP 1024.0000000000002000 1.0240000000000002e+003 0x1.0000000000001p+10 +0x1.0000000000001p+0010 +0d1.0000000000000002p+0010 approx %30.16f %30.16e %a to_hex_floatingpoint() to_dec_floatingpoint()