Hi, i need to check if an overflow of an floating-point arithmetic operation occured. Currently I'm doing something like this (for addition): (LHS > 0 && RHS > 0 && sum <= 0) || (LHS < 0 && RHS < 0 && sum >= 0) This is checked for every addition. Is there a more efficient way like the intrisic for int overflow? How is it possible to raise a signal like SIGFPE? Thanks! Regards, Steffen -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100723/2c8c67a7/attachment.html>
On Jul 23, 2010, at 7:20 AM, Steffen Geißinger wrote:> i need to check if an overflow of an floating-point arithmetic operation occured. > Currently I'm doing something like this (for addition): > > (LHS > 0 && RHS > 0 && sum <= 0) || (LHS < 0 && RHS < 0 && sum >= 0)IEEE floating-point doesn't overflow like this; if the magnitude of a result is too large to represent, it becomes an infinity rather than wrapping around like integer arithmetic. You want to check whether the result is infinite. I think the easiest way of doing that is to check whether (x - x) != (x - x). John. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100723/2f50019d/attachment.html>
On 23 July 2010 07:20, Steffen Geißinger <steffen.geissinger at googlemail.com> wrote:> > i need to check if an overflow of an floating-point arithmetic operation > occured. > Currently I'm doing something like this (for addition): > > (LHS > 0 && RHS > 0 && sum <= 0) || (LHS < 0 && RHS < 0 && sum >= 0) >Two things: 1) Have you tried adding 2 float-max values together to see what you get? It's not a negative (on most platforms, at least). IEEE floating-point has "infinities". 2) That method doesn't even work for integers, since overflow in signed addition is undefined, and compilers will, correctly, remove the check as impossible.
On Jul 23, 2010, at 7:20 AMPDT, Steffen Geißinger wrote:> Hi, > > i need to check if an overflow of an floating-point arithmetic > operation occured. > Currently I'm doing something like this (for addition): > > (LHS > 0 && RHS > 0 && sum <= 0) || (LHS < 0 && RHS < 0 && sum >= 0) > > This is checked for every addition. > Is there a more efficient way like the intrisic for int overflow? > How is it possible to raise a signal like SIGFPE?If you're talking about compile-time arithmetic, you should be using the APFloat library, which figures this out for you. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100723/9a9dde45/attachment.html>
Hello, i know that the result is infinte, but there are sill flags in the FPU which indicate that an overflow, underflow or div by zero occured. So isn't there an easy way to check if one of those flags is set? 2010/7/23 John McCall <rjmccall at apple.com>> On Jul 23, 2010, at 7:20 AM, Steffen Geißinger wrote: > > i need to check if an overflow of an floating-point arithmetic operation > occured. > Currently I'm doing something like this (for addition): > > (LHS > 0 && RHS > 0 && sum <= 0) || (LHS < 0 && RHS < 0 && sum >= 0) > > > IEEE floating-point doesn't overflow like this; if the magnitude of a > result is too > large to represent, it becomes an infinity rather than wrapping around like > integer > arithmetic. You want to check whether the result is infinite. > > I think the easiest way of doing that is to check whether (x - x) != (x - > x). > > John. >- If you're talking about compile-time arithmetic, you should be using the APFloat library, which figures this out for you. No I'm talking about run-time. -- Steffen -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100726/a22d86df/attachment.html>