On 2017-10-24 15:28:17 -0400, Tom Lane wrote: > Also, if I recall the old discussion properly, one concern was getting > uniform behavior across different platforms. I'm worried that if we do > what Andres suggests, we'll get behavior that is not only different but > platform-specific. Now, to the extent that you believe that every modern > platform implements edge-case IEEE float behavior the same way, that worry > may be obsolete. But I don't think I believe that.
Hm. Is the current code actually meaningfully less dependent on IEEE float behaviour? Both with the current behaviour and with the alternative of not ereporting we rely on infinity op something to result in infinity. Given that we're not preventing underflows, imprecise results, denormals from being continued to use, I don't think we're avoiding edge cases effectively at the moment. I just spent the last hours digging through intel's architecture manual. And discovered way too much weird stuff :/. There indeed doesn't really seem to be any sort of decent way to implement the overflow checks in an efficient manner. Clearing & testing the SSE floating point control register, which contains the overflow bit, is ~10 cycles each. The way gcc implements the isinf check as a bunch of compares and bitwizzery with constants - I don't see how to beat that. Btw, looking at this code I noticed that the current error messages aren't meaningful: =# SELECT '-1e38'::float4 + '-3e38'::float4; ERROR: 22003: value out of range: overflow The current code gets slightly better if I put an unlikely() around just the isinf(val) in CHECKFLOATVAL. Greetings, Andres Freund -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers