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