Infinite loop in frexp
## Summary There is an error, or at least an oversight, in one of the generic mathematical functions, namely frexp on line 351 of `rtl/inc/genmath.inc`. ``` procedure frexp(X: Real; out Mantissa: Real; out Exponent: longint); {* frexp() extracts the exponent from x. It returns an integer *} {* power of two to expnt and the significand between 0.5 and 1 *} {* to y. Thus x = y * 2**expn. *} begin exponent:=0; if (abs(x)<0.5) then While (abs(x)<0.5) do begin x := x*2; Dec(exponent); end else While (abs(x)>1) do begin x := x/2; Inc(exponent); end; Mantissa := x; end; ``` This gets used in the generic `fpc_sqrt_real` function (if a platform-specific square root instruction isn't supported). The bug is that if X is infinity, it lives up to its name as the function enters an infinite loop, because all operations upon X keep it set to infinity. NaNs should logically exit very quickly with the exponent set to zero because all of the conditions will evaluate to false. ## System Information <!-- The more information are provided the easier it is to replicate the bug --> - **Processor architecture:** Cross-platform (no native SQRT) - **Compiler version:** Trunk ## Steps to reproduce On any system without a native floating-point square root (`FPC_SYSTEM_HAS_SQRT` is not defined), call `Sqrt(1.0/0.0)` and note that the program never makes progress beyond this point. ## Possible fixes Since the format of the floating-point number cannot be guaranteed to be of a IEEE 754 standard, the input of `frexp` must explicitly check against ±∞, likely via ```if Abs(X)=1.0/0.0 then```.
issue