I think we should add the numbers only if it is likely that they will indeed produce an exception. The way you mentioned, we are adding regardless of whether there are exceptional cases in terms. Inline code would be helpful, I think too. So, I suppose this would be better:
```
new_terms = [ C.Float._new(t[0],1) for t in terms ]
if (S.NaN in new_terms or S.Infinity in new_terms
   or S.NegativeInfinity in new_terms):
    r = Add(*new_terms)
    r = evalf(r, prec+4, {})
    return r[0], r[2]
``` 
Comments?