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()