Hi Elias, On Fri, Nov 26, 2010 at 10:25:29AM -0300, Elias Gabriel Amaral da Silva wrote: > Hello, > > This simple program > > #include <stdio.h> > int main() > { > long double c, d, e; > c = 1.0/7.0; > d = 1.0; d /= 7.0; > e = 1.0L/7.0L; > printf("sizeof(7.0) = %u, sizeof(7.0L) = %u\n",sizeof(7.0),sizeof(7.0L)); > printf("%3.60Lf %3.60Lf\n", c, c*7.0); > printf("%3.60Lf %3.60Lf\n", d, d*7.0); > printf("%3.60Lf %3.60Lf\n", e, e*7.0); > > return 0; > } > > Seems to yield the same precision for long double on both ia32 and > amd64 - that is, just 20 digits. This seems too few, looking there: > > http://en.wikipedia.org/wiki/IEEE_754-2008#Basic_formats > > Shouldn't I expect at least more than 30 digits, on amd64? I think it's not specified for C what exactly is "long double" -- only some minimal requirements are "proposed". The implementation-dependend values are defined in <float.h> as DBL_EPSILON and LDBL_EPSILON (which is the difference between 1 and the smallest value bigger than 1 that can be represented in double and long double): There, 1e-9 is given as lower limit ==> you can only trust in 9 digits of precision, both for double AND long double! However, most implementation will use something better here). So try first on your machine a code like #include <float.h> #include <stdio.h> int main() { printf("%g %Lg\n",DBL_EPSILON, LDBL_EPSILON); } On my machines, this gives "2.22045e-16 1.0842e-19" both for i386 and amd64. This is the highes precision you can obtain using "long double" on those machines. Axel