1#! ./perl -w 2 3# These tests are in a separate .t file, because they may change 4# execution environment of the perl process. 5 6use strict; 7use warnings; 8 9use Test::More; 10use POSIX qw/:fenv_h :float_h/; 11 12my $defmode; 13plan skip_all => 'fegetround is unavailable' 14 unless eval { $defmode = fegetround(); 1 }; 15 16ok(defined $defmode, 'fegetround'); 17 18SKIP: { 19 skip 'default rounding mode is not FE_TONEAREST', 1 20 unless eval { $defmode == FE_TONEAREST() }; 21 my $flt_rounds; 22 skip 'FLT_ROUNDS is unavailable', 1 23 unless eval { $flt_rounds = FLT_ROUNDS(); 1 }; 24 cmp_ok($flt_rounds, '==', 1, 'FLT_ROUNDS'); 25} 26 27cmp_ok(fesetround($defmode), '==', 0, 'fesetround'); 28cmp_ok(fegetround(), '==', $defmode, 'fesetround/fegetround round-trip'); 29 30my @rounding = qw/TOWARDZERO TONEAREST UPWARD DOWNWARD/; 31 32for (my $i = 0; $i < @rounding; $i++) { 33 SKIP: { 34 my $macro = "FE_$rounding[$i]"; 35 my $femode = eval "$macro()"; 36 skip "no support for FE_$rounding[$i]", 3 37 unless defined $femode; 38 39 cmp_ok(fesetround($femode), '==', 0, "fesetround($macro)"); 40 cmp_ok(fegetround(), '==', $femode, "fegetround() under $macro"); 41 cmp_ok(FLT_ROUNDS, '==', $i, "FLT_ROUNDS under $macro"); 42 } 43} 44 45# Revert to default rounding mode 46fesetround($defmode); 47 48done_testing(); 49