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@virgin.net>