------- Comment #1 from pinskia at gmail dot com 2009-01-30 02:41 ------- Subject: Re: New: Decimal floating-point exception flags done wrong
Sent from my iPhone On Jan 29, 2009, at 6:00 PM, "tydeman at tybor dot com" <gcc-bugzi...@gcc.gnu.org > wrote: > Using gcc 4.3.2-7 on Intel Pentium 4 running Linux Fedora Core 10 and > -std=gnu99 There were some dfp fixes on the trunk relating to fp exceptions so you should try the trunk before reporting any more bugs. > > > /* DFP TR 24732 == WG14 / N1176, N1312 */ > #define __STDC_WANT_DEC_FP__ /* Tell implementation that we want > Decimal FP */ > #pragma STDC FENV_ACCESS ON /* will be testing FP exception > flags */ > > #include <stdio.h> /* printf() */ > #include <fenv.h> /* fetestexcept(), FE_* */ > #include <float.h> /* DEC*_MIN, DEC*_MAX */ > > > int main(void){ > _Decimal64 d10; > int before; > int after; > > before = feclearexcept( FE_ALL_EXCEPT ); > d10 = 1.0DD; > d10 /= 3.0DD; > after = fetestexcept( FE_ALL_EXCEPT ); > if( FE_INEXACT & after ){ > printf("Inexact raised as expected\n"); > }else{ > printf("Inexact wrong; after=%i\n", after); > } > > before = feclearexcept( FE_ALL_EXCEPT ); > d10 = DEC64_MIN; > d10 *= d10; > after = fetestexcept( FE_ALL_EXCEPT ); > if( FE_UNDERFLOW & after ){ > printf("Underflow raised as expected\n"); > }else{ > printf("Underflow wrong; after=%i\n", after); > } > > before = feclearexcept( FE_ALL_EXCEPT ); > d10 = DEC64_MAX; > d10 *= d10; > after = fetestexcept( FE_ALL_EXCEPT ); > if( FE_OVERFLOW & after ){ > printf("Overflow raised as expected\n"); > }else{ > printf("Overflow wrong; after=%i\n", after); > } > > before = feclearexcept( FE_ALL_EXCEPT ); > d10 = DEC64_MIN; > d10 /= (d10-d10); > after = fetestexcept( FE_ALL_EXCEPT ); > if( FE_DIVBYZERO & after ){ > printf("Divbyzero raised as expected\n"); > }else{ > printf("Divbyzero wrong; after=%i\n", after); > } > > before = feclearexcept( FE_ALL_EXCEPT ); > d10 = 0.0e-15DD; > d10 /= d10; > after = fetestexcept( FE_ALL_EXCEPT ); > if( FE_INVALID & after ){ > printf("Invalid raised as expected\n"); > }else{ > printf("Invalid wrong; after=%i\n", after); > } > > printf("%2i = FE_INEXACT\n", FE_INEXACT); > printf("%2i = FE_UNDERFLOW\n", FE_UNDERFLOW); > printf("%2i = FE_OVERFLOW\n", FE_OVERFLOW); > printf("%2i = FE_DIVBYZERO\n", FE_DIVBYZERO); > printf("%2i = FE_INVALID\n", FE_INVALID); > > return 0; > } > > gets: > > Inexact wrong; after=0 > Underflow wrong; after=0 > Overflow wrong; after=32 > Divbyzero wrong; after=0 > Invalid wrong; after=0 > 32 = FE_INEXACT > 16 = FE_UNDERFLOW > 8 = FE_OVERFLOW > 4 = FE_DIVBYZERO > 1 = FE_INVALID > > > -- > Summary: Decimal floating-point exception flags done wrong > Product: gcc > Version: 4.3.2 > Status: UNCONFIRMED > Severity: normal > Priority: P3 > Component: c > AssignedTo: unassigned at gcc dot gnu dot org > ReportedBy: tydeman at tybor dot com > GCC host triplet: 4.3.2 > GCC target triplet: 4.3.2 > > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39036 > -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39036