This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Bug c/39036] 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-bugzilla@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




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]