On 2012-09-11 11:34:58 -0700, H.J. Lu wrote: > On Tue, Sep 11, 2012 at 11:31 AM, Mohamed Abou Samra > <my_abousa...@yahoo.com> wrote: > > Hi All, > > > > I'm trying to write a small program to check the decimal floating > > point gcc extension but I encountered some problems > > > > The program just converts a _Decimal64 number to double to print > > it and I used the function (double __bid_truncdddf (_Decimal64 a) > > as the gnu online docs show)
If you cast the decimal64 value to double (whatever the method), the printed value may be incorrect (see below). > > #include <stdio.h> > > > > int main () > > { > > _Decimal64 d = 12.5DD; > > printf ("%lf\n",__bid_truncdddf(d) ); > > > > return 0; > > } > > > > $ gcc test.c -Wall -g > > test.c: In function ‘main’: > > test.c:23: warning: implicit declaration of function ‘__bid_truncdddf’ > > test.c:23: warning: format ‘%lf’ expects type ‘double’, but argument 2 has > > type ‘int’ > > > > $ ./a.out > > 0.000000 > > > > I don't know why the result is zero and why the second warning > > appears although I wrote the function properly! > > ,__bid_truncdddf is a libgcc internal function. Don't ever use it > in user programs. Just cast DFP to double. A double has 53 bits in general (always with GCC, AFAIK), so that it doesn't have enough precision to guarantee that the output in decimal (with the exact precision of _Decimal64) will be correct. There has recently been a related discussion in the MPFR list. See: https://sympa.inria.fr/sympa/arc/mpfr/2012-08/msg00027.html https://sympa.inria.fr/sympa/arc/mpfr/2012-08/msg00028.html https://sympa.inria.fr/sympa/arc/mpfr/2012-09/msg00011.html So, if long double has at least 55 bits, a solution would be to cast the _Decimal64 to long double. -- Vincent Lefèvre <vinc...@vinc17.net> - Web: <http://www.vinc17.net/> 100% accessible validated (X)HTML - Blog: <http://www.vinc17.net/blog/> Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)