use strict; use warnings; use Config; use Data::Float; # Set $prec to the required value # for "%.*e" formatting for the # nvtype that we have. my $prec = 35; # __float128 # Amend $prec's value as needed if( $Config{nvsize} == 8 ) { $prec = 16 } elsif( $Config{nvtype} eq 'long double' ) { $prec = 20 unless( $Config{longdblkind} == 1 || $Config{longdblkind} == 2 ); } my $val = 1.0; my $down = Data::Float::nextdown( $val ); my $up = Data::Float::nextup ( $val ); printf "%.${prec}e %a\n", $down, $down; printf "%.${prec}e %a\n", $val, $val; printf "%.${prec}e %a\n", $up, $up; #### 9.9999999999999989e-01 0x1.fffffffffffffp-1 1.0000000000000000e+00 0x1p+0 1.0000000000000002e+00 0x1.0000000000001p+0