half 0.1.1 → 0.2
raw patch · 3 files changed
+51/−42 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Numeric.Half: toFloat :: Half -> Float
+ Numeric.Half: fromHalf :: Half -> Float
+ Numeric.Half: instance Read Half
Files
- CHANGELOG.markdown +5/−0
- half.cabal +1/−1
- src/Numeric/Half.hs +45/−41
CHANGELOG.markdown view
@@ -1,3 +1,8 @@+0.2+---+* Renamed `toFloat` to `fromHalf` for easier unqualified use.+* Added a `Read` instance.+ 0.1.1 ----- * Added a `CTYPE` to the Half declaration so that it can be used with `CApiFFI` as an unsigned short.
half.cabal view
@@ -1,6 +1,6 @@ name: half category: Numeric-version: 0.1.1+version: 0.2 license: BSD3 cabal-version: >= 1.8 license-file: LICENSE
src/Numeric/Half.hs view
@@ -19,7 +19,7 @@ module Numeric.Half ( Half(..) , isZero- , toFloat+ , fromHalf , toHalf , pattern POS_INF , pattern NEG_INF@@ -39,77 +39,81 @@ import Data.Typeable import Foreign.C.Types import Foreign.Storable+import Text.Read -- | Convert a 'Float' to a 'Half' with proper rounding, while preserving NaN and dealing appropriately with infinity foreign import ccall unsafe "hs_floatToHalf" toHalf :: Float -> Half {-# RULES "toHalf" realToFrac = toHalf #-} -- | Convert a 'Half' to a 'Float' while preserving NaN-foreign import ccall unsafe "hs_halfToFloat" toFloat :: Half -> Float-{-# RULES "toFloat" realToFrac = toFloat #-}+foreign import ccall unsafe "hs_halfToFloat" fromHalf :: Half -> Float+{-# RULES "fromHalf" realToFrac = fromHalf #-} newtype {-# CTYPE "unsigned short" #-} Half = Half { getHalf :: CUShort } deriving (Storable, Typeable) instance Show Half where- showsPrec d h = showsPrec d (toFloat h)+ showsPrec d h = showsPrec d (fromHalf h) +instance Read Half where+ readPrec = fmap toHalf readPrec+ instance Eq Half where- (==) = (==) `on` toFloat+ (==) = (==) `on` fromHalf instance Ord Half where- compare = compare `on` toFloat+ compare = compare `on` fromHalf instance Real Half where- toRational = toRational . toFloat+ toRational = toRational . fromHalf instance Fractional Half where fromRational = toHalf . fromRational- recip = toHalf . recip . toFloat- a / b = toHalf $ toFloat a / toFloat b+ recip = toHalf . recip . fromHalf+ a / b = toHalf $ fromHalf a / fromHalf b instance RealFrac Half where- properFraction a = case properFraction (toFloat a) of+ properFraction a = case properFraction (fromHalf a) of (b, c) -> (b, toHalf c)- truncate = truncate . toFloat- round = round . toFloat- ceiling = ceiling . toFloat- floor = floor . toFloat+ truncate = truncate . fromHalf+ round = round . fromHalf+ ceiling = ceiling . fromHalf+ floor = floor . fromHalf instance Floating Half where pi = toHalf pi- exp = toHalf . exp . toFloat- sqrt = toHalf . sqrt . toFloat- log = toHalf . log . toFloat- a ** b = toHalf $ toFloat a ** toFloat b- logBase a b = toHalf $ logBase (toFloat a) (toFloat b)- sin = toHalf . sin . toFloat- tan = toHalf . tan . toFloat- cos = toHalf . cos . toFloat- asin = toHalf . asin . toFloat- atan = toHalf . atan . toFloat- acos = toHalf . acos . toFloat- sinh = toHalf . sinh . toFloat- tanh = toHalf . tanh . toFloat- cosh = toHalf . cosh . toFloat- asinh = toHalf . asinh . toFloat- atanh = toHalf . atanh . toFloat- acosh = toHalf . acosh . toFloat+ exp = toHalf . exp . fromHalf+ sqrt = toHalf . sqrt . fromHalf+ log = toHalf . log . fromHalf+ a ** b = toHalf $ fromHalf a ** fromHalf b+ logBase a b = toHalf $ logBase (fromHalf a) (fromHalf b)+ sin = toHalf . sin . fromHalf+ tan = toHalf . tan . fromHalf+ cos = toHalf . cos . fromHalf+ asin = toHalf . asin . fromHalf+ atan = toHalf . atan . fromHalf+ acos = toHalf . acos . fromHalf+ sinh = toHalf . sinh . fromHalf+ tanh = toHalf . tanh . fromHalf+ cosh = toHalf . cosh . fromHalf+ asinh = toHalf . asinh . fromHalf+ atanh = toHalf . atanh . fromHalf+ acosh = toHalf . acosh . fromHalf instance RealFloat Half where floatRadix _ = 2 floatDigits _ = 11- decodeFloat = decodeFloat . toFloat+ decodeFloat = decodeFloat . fromHalf isInfinite (Half h) = unsafeShiftR h 10 .&. 0x1f >= 32 isIEEE _ = isIEEE (undefined :: Float)- atan2 a b = toHalf $ atan2 (toFloat a) (toFloat b)+ atan2 a b = toHalf $ atan2 (fromHalf a) (fromHalf b) isDenormalized (Half h) = unsafeShiftR h 10 .&. 0x1f == 0 && h .&. 0x3ff /= 0 isNaN (Half h) = unsafeShiftR h 10 .&. 0x1f == 0x1f && h .&. 0x3ff /= 0 isNegativeZero (Half h) = h == 0x8000 floatRange _ = (16,-13) encodeFloat i j = toHalf $ encodeFloat i j- exponent = exponent . toFloat- significand = toHalf . significand . toFloat- scaleFloat n = toHalf . scaleFloat n . toFloat+ exponent = exponent . fromHalf+ significand = toHalf . significand . fromHalf+ scaleFloat n = toHalf . scaleFloat n . fromHalf -- | Is this 'Half' equal to 0? isZero :: Half -> Bool@@ -149,10 +153,10 @@ pattern HALF_MAX_10_EXP = 4 instance Num Half where- a * b = toHalf (toFloat a * toFloat b)- a - b = toHalf (toFloat a - toFloat b)- a + b = toHalf (toFloat a + toFloat b)+ a * b = toHalf (fromHalf a * fromHalf b)+ a - b = toHalf (fromHalf a - fromHalf b)+ a + b = toHalf (fromHalf a + fromHalf b) negate (Half a) = Half (xor 0x8000 a)- abs = toHalf . abs . toFloat- signum = toHalf . signum . toFloat+ abs = toHalf . abs . fromHalf+ signum = toHalf . signum . fromHalf fromInteger a = toHalf (fromInteger a)