Fixes classify function to detect subnormal floating points (#12836)
* Fix classify to test for subnormality. * Minor fix. * Modified to maintain existing API. * Minor change. * Removed 32-bit case since float is always 64-bit.
This commit is contained in:
parent
5da27a891c
commit
ae7b53ec51
1 changed files with 19 additions and 15 deletions
|
|
@ -117,6 +117,8 @@ const
|
|||
## meaningful digits
|
||||
## after the decimal point
|
||||
## for Nim's ``float`` type.
|
||||
MinFloatNormal* = 2.225073858507201e-308 ## Smallest normal number for Nim's
|
||||
## ``float`` type. (= 2^-1022).
|
||||
RadPerDeg = PI / 180.0 ## Number of radians per degree
|
||||
|
||||
type
|
||||
|
|
@ -140,6 +142,7 @@ proc classify*(x: float): FloatClass =
|
|||
doAssert classify(0.0) == fcZero
|
||||
doAssert classify(0.3/0.0) == fcInf
|
||||
doAssert classify(-0.3/0.0) == fcNegInf
|
||||
doAssert classify(5.0e-324) == fcSubnormal
|
||||
|
||||
# JavaScript and most C compilers have no classify:
|
||||
if x == 0.0:
|
||||
|
|
@ -151,8 +154,9 @@ proc classify*(x: float): FloatClass =
|
|||
if x > 0.0: return fcInf
|
||||
else: return fcNegInf
|
||||
if x != x: return fcNan
|
||||
if abs(x) < MinFloatNormal:
|
||||
return fcSubnormal
|
||||
return fcNormal
|
||||
# XXX: fcSubnormal is not detected!
|
||||
|
||||
proc isPowerOfTwo*(x: int): bool {.noSideEffect.} =
|
||||
## Returns ``true``, if ``x`` is a power of two, ``false`` otherwise.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue