http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59227
--- Comment #6 from Francois-Xavier Coudert <fxcoudert at gcc dot gnu.org> --- (In reply to Andreas Schwab from comment #5) > 4.68542210148937626195884133993966578E-0002 > -1.87533922948603221391158058278771595E+0920 And this (at -O2)? __float128 foo (__float128 x) { __float128 sum = 0, oldsum; __float128 inv2x2 = 1 / (2 * x * x); __float128 fac = 1; int n = 1; while (n < 200) { fac *= - (2*n - 1) * inv2x2; oldsum = sum; sum += fac; __builtin_printf ("%lg\n", (double) fac); if (sum == oldsum) break; n++; } return (1 + sum) / x * (1.1283791670955125738961589031215452Q / 2); } int main (void) { __float128 x = 12; x = foo(x); __builtin_printf ("%lg\n", (double) x); }