diff --git a/CHANGELOG.md b/CHANGELOG.md index b42a1ed..1b02228 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Notable changes to this project are documented in this file. The format is based Breaking changes: New features: +- Added constants `epsilon`, `minPosNumber` and `maxNumber` (#24 by @JamieBallingall) Bugfixes: diff --git a/src/Data/Number.purs b/src/Data/Number.purs index 926b2e5..9ae6b64 100644 --- a/src/Data/Number.purs +++ b/src/Data/Number.purs @@ -1,10 +1,14 @@ --- | Functions for working with PureScripts builtin `Number` type. +-- | Functions for working with PureScript's builtin `Number` type. A `Number` +-- | is a double precision floating point number (IEEE 754 binary64). module Data.Number ( fromString , nan , isNaN , infinity , isFinite + , epsilon + , minPosNumber + , maxNumber , abs , acos , asin @@ -82,6 +86,34 @@ foreign import infinity :: Number -- | ``` foreign import isFinite :: Number -> Boolean +-- | Machine epsilon according to the "widespread variant definition". That is +-- | the difference between 1.0 and the next larger `Number`. +-- | ```purs +-- | > epsilon == 2.0 `pow` (-52.0) +-- | true +-- | ``` +epsilon :: Number +epsilon = 2.220446049250313e-16 + +-- | The smallest positive `Number`. +-- | ```purs +-- | > minNumber == 2.0 `pow` (-1074.0) +-- | true +-- | +-- | > sign minNumber +-- | 1.0 +-- | ``` +minPosNumber :: Number +minPosNumber = 5e-324 + +-- | The largest finite `Number`. +-- | ``` +-- | > maxNumber == (2.0 `pow` 1023.0) * (1.0 + (1.0 - 2.0 `pow` (-52.0))) +-- | true +-- | ``` +maxNumber :: Number +maxNumber = 1.7976931348623157e+308 + -- | Attempt to parse a `Number` using JavaScripts `parseFloat`. Returns -- | `Nothing` if the parse fails or if the result is not a finite number. -- | diff --git a/test/Test/Main.purs b/test/Test/Main.purs index 98e466d..3c8210f 100644 --- a/test/Test/Main.purs +++ b/test/Test/Main.purs @@ -3,7 +3,7 @@ module Test.Main where import Prelude import Data.Maybe (Maybe(..), fromMaybe) -import Data.Number ((%), abs, acos, asin, atan, atan2, ceil, cos, exp, floor, fromString, infinity, isFinite, isNaN, ln10, ln2, log10e, log2e, nan, pi, pow, round, sign, sin, sqrt, sqrt1_2, sqrt2, tan, tau, trunc) +import Data.Number ((%), abs, acos, asin, atan, atan2, ceil, cos, epsilon, exp, floor, fromString, infinity, isFinite, isNaN, ln10, ln2, log10e, log2e, minPosNumber, maxNumber, nan, pi, pow, round, sign, sin, sqrt, sqrt1_2, sqrt2, tan, tau, trunc) import Data.Number (log) as Num import Data.Number.Approximate (Fraction(..), Tolerance(..), eqAbsolute, eqRelative, (≅), (≇)) import Data.Number.Format (precision, fixed, exponential, toStringWith, toString) @@ -42,6 +42,18 @@ globalsTestCode = do log "isFinite 0.0" assert $ isFinite 0.0 + log "epsilon equals 2^-52" + assert $ epsilon == 2.0 `pow` (-52.0) + + log "minPosNumber equals 2^-1074" + assert $ minPosNumber == 2.0 `pow` (-1074.0) + + log "The sign of minPosNumber is 1.0" + assert $ sign minPosNumber == 1.0 + + log "maxNumber equals 2^1023 * (1 + (1 - 2^-52))" + assert $ maxNumber == (2.0 `pow` 1023.0) * (1.0 + (1.0 - 2.0 `pow` (-52.0))) + -- Test code originally in this repo before parts of deprecated -- `purescript-globals` repo was moved to this repo.