# Enum on Float/Double

Glynn Clements glynn.clements at virgin.net
Thu Oct 23 00:54:37 EDT 2003

```Hal Daume III wrote:

> This works great for when x/=0...is there a good (Haskell) solution for
> the smallest positive float?

I think that the following are correct for the smallest normalised
Float and Double values:

Prelude> encodeFloat 1 (fst (floatRange (0 :: Float)) - 1) :: Float
1.1754944e-38

Prelude> encodeFloat 1 (fst (floatRange (0 :: Double)) - 1) :: Double
2.2250738585072014e-308

They (roughly) agree with FLT_MIN and DBL_MIN from <float.h>:

#define FLT_MIN 1.17549435e-38F
...
#define DBL_MIN 2.2250738585072014e-308

Furthermore, these values aren't denormalised, but reducing the
exponent by one gives a denormalised value:

Prelude> isDenormalized (encodeFloat 1 (fst (floatRange (0 :: Float)) - 1) :: Float)
False
Prelude> isDenormalized (encodeFloat 1 (fst (floatRange (0 :: Float)) - 2) :: Float)
True
Prelude> isDenormalized (encodeFloat 1 (fst (floatRange (0 :: Double)) - 1) :: Double)
False
Prelude> isDenormalized (encodeFloat 1 (fst (floatRange (0 :: Double)) - 2) :: Double)
True

These appear to give the smallest possible Float/Double values:

Prelude> encodeFloat 1 (fst (floatRange (0 :: Double)) - floatDigits (0 :: Double)) :: Double
5.0e-324
Prelude> encodeFloat 1 (fst (floatRange (0 :: Float)) - floatDigits (0 :: Float)) :: Float
1.0e-45

Reducing the exponent by 1 gives 0.0:

Prelude> encodeFloat 1 (fst (floatRange (0 :: Float)) - floatDigits (0 :: Float) - 1) :: Float
0.0
Prelude> encodeFloat 1 (fst (floatRange (0 :: Double)) - floatDigits (0 :: Double) - 1) :: Double
0.0

--
Glynn Clements <glynn.clements at virgin.net>
```