It's just tracking round error internally to the library when needed:
\n\n\n[voyager] drossl 1: ~> vi junk.c\n\n#include <math.h>\n\nvoid main(void)\n{\n float a, x = 1.0;\n double b, y = 1.0;\n long double c, z = 1.0;\n\n a = atan(x);\n b = atan(y);\n c = atan(z);\n\n c = (long double) a + (long double) b;\n}\n\n[voyager] drossl 2: ~> gcc -S -O0 junk.c\njunk.c: In function `main':\njunk.c:4: warning: return type of `main' is not `int'\n[voyager] drossl 3: ~> vi junk.s\n\n .file "junk.c"\n .text\n.globl main\n .type main, @function\nmain:\n\n; Set up\n\n pushl %ebp\n movl %esp, %ebp\n subl $88, %esp\n andl $-16, %esp\n movl $0, %eax\n subl %eax, %esp\n movl $0x3f800000, -16(%ebp)\n movl $0, -32(%ebp)\n movl $1072693248, -28(%ebp)\n movl $0, -72(%ebp)\n movl $-2147483648, -68(%ebp)\n movl $16383, -64(%ebp)\n\n; float call to atan\n\n subl $8, %esp\n flds -16(%ebp)\n leal -8(%esp), %esp\n fstpl (%esp)\n call atan\n\n; double call to atan\n\n addl $16, %esp\n fstps -12(%ebp)\n subl $8, %esp\n pushl -28(%ebp)\n pushl -32(%ebp)\n call atan\n\n; long double call to atan\n\n addl $16, %esp\n fstpl -24(%ebp)\n subl $8, %esp\n fldt -72(%ebp)\n fstpl -88(%ebp)\n movl -88(%ebp), %eax\n movl -84(%ebp), %edx\n pushl %edx\n pushl %eax\n call atan\n\n; long double arithmetic\n\n addl $16, %esp\n fstpt -56(%ebp)\n flds -12(%ebp)\n fldl -24(%ebp)\n faddp %st, %st(1)\n fstpt -56(%ebp)\n\n leave\n ret\n .size main, .-main\n .ident "GCC: (GNU) 3.3 20030226 (prerelease) (SuSE Linux)"\n\n\n