{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -Wno-unticked-promoted-constructors #-}
{-# OPTIONS_GHC -Wno-type-defaults #-}
{-# OPTIONS_GHC -Wno-unused-top-binds #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
module Posit
(Posit(),
Posit8,
Posit16,
Posit32,
Posit64,
Posit128,
Posit256,
P8,
P16,
P32,
P64,
P128,
P256,
pattern NaR,
pattern R,
FusedOps(..),
Convertible(..),
#ifndef O_NO_SHOW
AltShow(..),
#endif
AltFloating(..),
viaIntegral,
viaRational,
viaRational2,
viaRational3,
viaRational4,
viaRational6,
viaRational8
) where
import Prelude hiding (rem)
import Data.Scientific (scientificP
,fromRationalRepetendUnlimited
,formatScientific
,FPFormat(Generic))
import Text.Read (Lexeme(Ident)
,readPrec
,readListPrec
,(+++)
,pfail
,readListPrecDefault
,lexP
,lift
,parens)
import Data.Foldable (toList)
#ifndef O_NO_STORABLE_RANDOM
import Foreign.Storable (Storable, sizeOf, alignment, peek, poke)
import Foreign.Ptr (Ptr, castPtr)
import System.Random (Random(random,randomR))
import System.Random.Stateful (Uniform, uniform, uniformM)
import Data.Bits (shiftL, (.&.), (.|.))
#endif
import GHC.Natural (Natural)
import Data.Ratio ((%))
import Control.DeepSeq (NFData, rnf)
import Posit.Internal.PositC
data Posit (es :: ES) where
Posit :: PositC es => !(IntN es) -> Posit es
instance NFData (Posit es) where
rnf :: Posit es -> ()
rnf (Posit IntN es
_) = ()
pattern NaR :: forall es. PositC es => Posit es
pattern $bNaR :: forall (es :: ES). PositC es => Posit es
$mNaR :: forall {r} {es :: ES}.
PositC es =>
Posit es -> ((# #) -> r) -> ((# #) -> r) -> r
NaR <- (Posit (decode @es -> Nothing)) where
NaR = forall (es :: ES). PositC es => IntN es -> Posit es
Posit (forall (es :: ES). PositC es => IntN es
unReal @es)
pattern R :: forall es. PositC es => Rational -> Posit es
pattern $bR :: forall (es :: ES). PositC es => Rational -> Posit es
$mR :: forall {r} {es :: ES}.
PositC es =>
Posit es -> (Rational -> r) -> ((# #) -> r) -> r
R r <- (Posit (decode @es -> Just r)) where
R Rational
r = forall (es :: ES). PositC es => IntN es -> Posit es
Posit (forall (es :: ES). PositC es => Maybe Rational -> IntN es
encode @es forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just Rational
r)
{-# COMPLETE NaR, R #-}
type Posit8 = Posit Z_3_2
type Posit16 = Posit I_3_2
type Posit32 = Posit II_3_2
type Posit64 = Posit III_3_2
type Posit128 = Posit IV_3_2
type Posit256 = Posit V_3_2
type P8 = Posit Z_2022
type P16 = Posit I_2022
type P32 = Posit II_2022
type P64 = Posit III_2022
type P128 = Posit IV_2022
type P256 = Posit V_2022
#ifndef O_NO_SHOW
instance PositC es => Show (Posit es) where
show :: Posit es -> String
show Posit es
NaR = String
"NaR"
show (R Rational
r) = FPFormat -> Maybe Int -> Scientific -> String
formatScientific FPFormat
Generic (forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall (es :: ES). PositC es => Int
decimalPrec @es) (forall a b. (a, b) -> a
fstforall b c a. (b -> c) -> (a -> b) -> a -> c
.Rational -> (Scientific, Maybe Int)
fromRationalRepetendUnlimited forall a b. (a -> b) -> a -> b
$ Rational
r)
#endif
instance PositC es => Eq (Posit es) where
(Posit IntN es
int1) == :: Posit es -> Posit es -> Bool
== (Posit IntN es
int2) = IntN es
int1 forall a. Eq a => a -> a -> Bool
== IntN es
int2
instance PositC es => Ord (Posit es) where
compare :: Posit es -> Posit es -> Ordering
compare (Posit IntN es
int1) (Posit IntN es
int2) = forall a. Ord a => a -> a -> Ordering
compare IntN es
int1 IntN es
int2
instance PositC es => Num (Posit es) where
+ :: Posit es -> Posit es -> Posit es
(+) = forall (es :: ES).
PositC es =>
(Rational -> Rational -> Rational)
-> Posit es -> Posit es -> Posit es
viaRational2 forall a. Num a => a -> a -> a
(+)
* :: Posit es -> Posit es -> Posit es
(*) = forall (es :: ES).
PositC es =>
(Rational -> Rational -> Rational)
-> Posit es -> Posit es -> Posit es
viaRational2 forall a. Num a => a -> a -> a
(*)
abs :: Posit es -> Posit es
abs = forall (es :: ES).
PositC es =>
(IntN es -> IntN es) -> Posit es -> Posit es
viaIntegral forall a. Num a => a -> a
abs
signum :: Posit es -> Posit es
signum = forall (es :: ES).
PositC es =>
(Rational -> Rational) -> Posit es -> Posit es
viaRational forall a. Num a => a -> a
signum
fromInteger :: Integer -> Posit es
fromInteger Integer
int = forall (es :: ES). PositC es => Rational -> Posit es
R forall a b. (a -> b) -> a -> b
$ forall a. Num a => Integer -> a
fromInteger Integer
int
negate :: Posit es -> Posit es
negate = forall (es :: ES).
PositC es =>
(IntN es -> IntN es) -> Posit es -> Posit es
viaIntegral forall a. Num a => a -> a
negate
viaIntegral :: PositC es => (IntN es -> IntN es) -> Posit es -> Posit es
viaIntegral :: forall (es :: ES).
PositC es =>
(IntN es -> IntN es) -> Posit es -> Posit es
viaIntegral IntN es -> IntN es
f (Posit IntN es
int) = forall (es :: ES). PositC es => IntN es -> Posit es
Posit forall a b. (a -> b) -> a -> b
$ IntN es -> IntN es
f IntN es
int
instance PositC es => Enum (Posit es) where
succ :: Posit es -> Posit es
succ = forall (es :: ES).
PositC es =>
(IntN es -> IntN es) -> Posit es -> Posit es
viaIntegral (forall a. Num a => a -> a -> a
+IntN es
1)
pred :: Posit es -> Posit es
pred = forall (es :: ES).
PositC es =>
(IntN es -> IntN es) -> Posit es -> Posit es
viaIntegral (forall a. Num a => a -> a -> a
subtract IntN es
1)
enumFrom :: Posit es -> [Posit es]
enumFrom Posit es
n = forall a. Enum a => a -> a -> [a]
enumFromTo Posit es
n forall a. Bounded a => a
maxBound
enumFromTo :: Posit es -> Posit es -> [Posit es]
enumFromTo Posit es
n Posit es
m
| Posit es
n forall a. Eq a => a -> a -> Bool
== Posit es
m = [Posit es
n]
| Posit es
n forall a. Ord a => a -> a -> Bool
< Posit es
m = Posit es
n forall a. a -> [a] -> [a]
: forall a. Enum a => a -> a -> [a]
enumFromTo (forall a. Enum a => a -> a
succ Posit es
n) Posit es
m
| Bool
otherwise = []
enumFromThen :: Posit es -> Posit es -> [Posit es]
enumFromThen Posit es
NaR Posit es
_ = [forall (es :: ES). PositC es => Posit es
NaR]
enumFromThen Posit es
_ Posit es
NaR = [forall (es :: ES). PositC es => Posit es
NaR]
enumFromThen Posit es
n Posit es
m = Posit es
n forall a. a -> [a] -> [a]
: Posit es -> [Posit es]
go Posit es
n
where
step :: Posit es
step = Posit es
m forall a. Num a => a -> a -> a
- Posit es
n
go :: Posit es -> [Posit es]
go :: Posit es -> [Posit es]
go Posit es
NaR = [forall (es :: ES). PositC es => Posit es
NaR]
go !Posit es
l = case forall a. Ord a => a -> a -> Ordering
compare Posit es
step Posit es
0 of
Ordering
LT -> let !n' :: Posit es
n' = Posit es
l forall a. Num a => a -> a -> a
+ Posit es
step
in if Posit es
n' forall a. Num a => a -> a -> a
- Posit es
l forall a. Ord a => a -> a -> Bool
> Posit es
step
then []
else Posit es
n' forall a. a -> [a] -> [a]
: Posit es -> [Posit es]
go Posit es
n'
Ordering
EQ -> [Posit es
n, Posit es
m]
Ordering
GT -> let !n' :: Posit es
n' = Posit es
l forall a. Num a => a -> a -> a
+ Posit es
step
in if Posit es
n' forall a. Num a => a -> a -> a
- Posit es
l forall a. Ord a => a -> a -> Bool
< Posit es
step
then []
else Posit es
n' forall a. a -> [a] -> [a]
: Posit es -> [Posit es]
go Posit es
n'
enumFromThenTo :: Posit es -> Posit es -> Posit es -> [Posit es]
enumFromThenTo Posit es
NaR Posit es
_ Posit es
_ = [forall (es :: ES). PositC es => Posit es
NaR]
enumFromThenTo Posit es
_ Posit es
NaR Posit es
_ = [forall (es :: ES). PositC es => Posit es
NaR]
enumFromThenTo Posit es
_ Posit es
_ Posit es
NaR = [forall (es :: ES). PositC es => Posit es
NaR]
enumFromThenTo Posit es
e1 Posit es
e2 Posit es
e3 = forall a. (a -> Bool) -> [a] -> [a]
takeWhile Posit es -> Bool
predicate (forall a. Enum a => a -> a -> [a]
enumFromThen Posit es
e1 Posit es
e2)
where
mid :: Posit es
mid = (Posit es
e2 forall a. Num a => a -> a -> a
- Posit es
e1) forall a. Fractional a => a -> a -> a
/ Posit es
2
predicate :: Posit es -> Bool
predicate | Posit es
e2 forall a. Ord a => a -> a -> Bool
>= Posit es
e1 = (forall a. Ord a => a -> a -> Bool
<= Posit es
e3 forall a. Num a => a -> a -> a
+ Posit es
mid)
| Bool
otherwise = (forall a. Ord a => a -> a -> Bool
>= Posit es
e3 forall a. Num a => a -> a -> a
+ Posit es
mid)
instance PositC es => Fractional (Posit es) where
fromRational :: Rational -> Posit es
fromRational = forall (es :: ES). PositC es => Rational -> Posit es
R
recip :: Posit es -> Posit es
recip Posit es
0 = forall (es :: ES). PositC es => Posit es
NaR
recip Posit es
p = forall (es :: ES).
PositC es =>
(Rational -> Rational) -> Posit es -> Posit es
viaRational forall a. Fractional a => a -> a
recip Posit es
p
instance PositC es => Real (Posit es) where
toRational :: Posit es -> Rational
toRational Posit es
NaR = forall a. HasCallStack => String -> a
error String
"Your input is Not a Real or Rational (NaR) number, please try again!"
toRational (R Rational
r) = Rational
r
viaRational :: PositC es => (Rational -> Rational) -> Posit es -> Posit es
viaRational :: forall (es :: ES).
PositC es =>
(Rational -> Rational) -> Posit es -> Posit es
viaRational Rational -> Rational
_ Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
viaRational Rational -> Rational
f (R Rational
r) = forall a. Fractional a => Rational -> a
fromRational forall a b. (a -> b) -> a -> b
$ Rational -> Rational
f Rational
r
viaRational2 :: PositC es => (Rational -> Rational -> Rational) -> Posit es -> Posit es -> Posit es
viaRational2 :: forall (es :: ES).
PositC es =>
(Rational -> Rational -> Rational)
-> Posit es -> Posit es -> Posit es
viaRational2 Rational -> Rational -> Rational
_ Posit es
NaR Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational2 Rational -> Rational -> Rational
_ Posit es
_ Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
viaRational2 Rational -> Rational -> Rational
f (R Rational
r1) (R Rational
r2) = forall (es :: ES). PositC es => Rational -> Posit es
R forall a b. (a -> b) -> a -> b
$ Rational
r1 Rational -> Rational -> Rational
`f` Rational
r2
viaRational3 :: PositC es => (Rational -> Rational -> Rational -> Rational) -> Posit es -> Posit es -> Posit es -> Posit es
viaRational3 :: forall (es :: ES).
PositC es =>
(Rational -> Rational -> Rational -> Rational)
-> Posit es -> Posit es -> Posit es -> Posit es
viaRational3 Rational -> Rational -> Rational -> Rational
_ Posit es
NaR Posit es
_ Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational3 Rational -> Rational -> Rational -> Rational
_ Posit es
_ Posit es
NaR Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational3 Rational -> Rational -> Rational -> Rational
_ Posit es
_ Posit es
_ Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
viaRational3 Rational -> Rational -> Rational -> Rational
f (R Rational
r1) (R Rational
r2) (R Rational
r3) = forall (es :: ES). PositC es => Rational -> Posit es
R forall a b. (a -> b) -> a -> b
$ Rational -> Rational -> Rational -> Rational
f Rational
r1 Rational
r2 Rational
r3
viaRational4 :: PositC es => (Rational -> Rational -> Rational -> Rational -> Rational) -> Posit es -> Posit es -> Posit es -> Posit es -> Posit es
viaRational4 :: forall (es :: ES).
PositC es =>
(Rational -> Rational -> Rational -> Rational -> Rational)
-> Posit es -> Posit es -> Posit es -> Posit es -> Posit es
viaRational4 Rational -> Rational -> Rational -> Rational -> Rational
_ Posit es
NaR Posit es
_ Posit es
_ Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational4 Rational -> Rational -> Rational -> Rational -> Rational
_ Posit es
_ Posit es
NaR Posit es
_ Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational4 Rational -> Rational -> Rational -> Rational -> Rational
_ Posit es
_ Posit es
_ Posit es
NaR Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational4 Rational -> Rational -> Rational -> Rational -> Rational
_ Posit es
_ Posit es
_ Posit es
_ Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
viaRational4 Rational -> Rational -> Rational -> Rational -> Rational
f (R Rational
r0) (R Rational
r1) (R Rational
r2) (R Rational
r3) = forall (es :: ES). PositC es => Rational -> Posit es
R forall a b. (a -> b) -> a -> b
$ Rational -> Rational -> Rational -> Rational -> Rational
f Rational
r0 Rational
r1 Rational
r2 Rational
r3
viaRational6 :: PositC es => (Rational -> Rational -> Rational -> Rational -> Rational -> Rational -> Rational) -> Posit es -> Posit es -> Posit es -> Posit es -> Posit es -> Posit es -> Posit es
viaRational6 :: forall (es :: ES).
PositC es =>
(Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational)
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
viaRational6 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
NaR Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational6 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
_ Posit es
NaR Posit es
_ Posit es
_ Posit es
_ Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational6 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
_ Posit es
_ Posit es
NaR Posit es
_ Posit es
_ Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational6 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
_ Posit es
_ Posit es
_ Posit es
NaR Posit es
_ Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational6 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
NaR Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational6 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
viaRational6 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
f (R Rational
a1) (R Rational
a2) (R Rational
a3) (R Rational
b1) (R Rational
b2) (R Rational
b3) = forall (es :: ES). PositC es => Rational -> Posit es
R forall a b. (a -> b) -> a -> b
$ Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
f Rational
a1 Rational
a2 Rational
a3 Rational
b1 Rational
b2 Rational
b3
viaRational8 :: PositC es => (Rational -> Rational -> Rational -> Rational -> Rational -> Rational -> Rational -> Rational -> Rational) -> Posit es -> Posit es -> Posit es -> Posit es -> Posit es -> Posit es -> Posit es -> Posit es -> Posit es
viaRational8 :: forall (es :: ES).
PositC es =>
(Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational)
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
viaRational8 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
NaR Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational8 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
_ Posit es
NaR Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational8 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
_ Posit es
_ Posit es
NaR Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational8 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
_ Posit es
_ Posit es
_ Posit es
NaR Posit es
_ Posit es
_ Posit es
_ Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational8 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
NaR Posit es
_ Posit es
_ Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational8 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
NaR Posit es
_ Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational8 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
NaR Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
viaRational8 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
_ Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
viaRational8 Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
f (R Rational
a0) (R Rational
a1) (R Rational
a2) (R Rational
a3) (R Rational
b0) (R Rational
b1) (R Rational
b2) (R Rational
b3) = forall (es :: ES). PositC es => Rational -> Posit es
R forall a b. (a -> b) -> a -> b
$ Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
f Rational
a0 Rational
a1 Rational
a2 Rational
a3 Rational
b0 Rational
b1 Rational
b2 Rational
b3
instance PositC es => Bounded (Posit es) where
minBound :: Posit es
minBound = forall (es :: ES). PositC es => IntN es -> Posit es
Posit (forall (es :: ES). PositC es => IntN es
mostNegVal @es)
maxBound :: Posit es
maxBound = forall (es :: ES). PositC es => IntN es -> Posit es
Posit (forall (es :: ES). PositC es => IntN es
mostPosVal @es)
class Num a => FusedOps a where
fma :: a -> a -> a -> a
fam :: a -> a -> a -> a
fmms :: a -> a -> a -> a -> a
fsum3 :: a -> a -> a -> a
fsum4 :: a -> a -> a -> a -> a
fsumL :: Foldable t => t a -> a
fdot3 :: a -> a -> a -> a -> a -> a -> a
fdot4 :: a -> a -> a -> a -> a -> a -> a -> a -> a
fdotL :: Foldable t => t a -> t a -> a
fsm :: a -> a -> a -> a
instance FusedOps Rational where
fsm :: Rational -> Rational -> Rational -> Rational
fsm Rational
a Rational
b Rational
c = Rational
a forall a. Num a => a -> a -> a
- (Rational
b forall a. Num a => a -> a -> a
* Rational
c)
fma :: Rational -> Rational -> Rational -> Rational
fma Rational
a Rational
b Rational
c = (Rational
a forall a. Num a => a -> a -> a
* Rational
b) forall a. Num a => a -> a -> a
+ Rational
c
fam :: Rational -> Rational -> Rational -> Rational
fam Rational
a Rational
b Rational
c = (Rational
a forall a. Num a => a -> a -> a
+ Rational
b) forall a. Num a => a -> a -> a
* Rational
c
fmms :: Rational -> Rational -> Rational -> Rational -> Rational
fmms Rational
a Rational
b Rational
c Rational
d = (Rational
a forall a. Num a => a -> a -> a
* Rational
b) forall a. Num a => a -> a -> a
- (Rational
c forall a. Num a => a -> a -> a
* Rational
d)
fsum3 :: Rational -> Rational -> Rational -> Rational
fsum3 Rational
a Rational
b Rational
c = Rational
a forall a. Num a => a -> a -> a
+ Rational
b forall a. Num a => a -> a -> a
+ Rational
c
fsum4 :: Rational -> Rational -> Rational -> Rational -> Rational
fsum4 Rational
a Rational
b Rational
c Rational
d = Rational
a forall a. Num a => a -> a -> a
+ Rational
b forall a. Num a => a -> a -> a
+ Rational
c forall a. Num a => a -> a -> a
+ Rational
d
fsumL :: forall (t :: * -> *). Foldable t => t Rational -> Rational
fsumL (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList -> [Rational]
l) = forall {t}. Num t => [t] -> t -> t
go [Rational]
l Rational
0
where
go :: [t] -> t -> t
go [] t
acc = t
acc
go (t
x : [t]
xs) t
acc = [t] -> t -> t
go [t]
xs (t
acc forall a. Num a => a -> a -> a
+ t
x)
fdot3 :: Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
fdot3 Rational
a1 Rational
a2 Rational
a3 Rational
b1 Rational
b2 Rational
b3 = (Rational
a1 forall a. Num a => a -> a -> a
* Rational
b1) forall a. Num a => a -> a -> a
+ (Rational
a2 forall a. Num a => a -> a -> a
* Rational
b2) forall a. Num a => a -> a -> a
+ (Rational
a3 forall a. Num a => a -> a -> a
* Rational
b3)
fdot4 :: Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
fdot4 Rational
a0 Rational
a1 Rational
a2 Rational
a3 Rational
b0 Rational
b1 Rational
b2 Rational
b3 = (Rational
a0 forall a. Num a => a -> a -> a
* Rational
b0) forall a. Num a => a -> a -> a
+ (Rational
a1 forall a. Num a => a -> a -> a
* Rational
b1) forall a. Num a => a -> a -> a
+ (Rational
a2 forall a. Num a => a -> a -> a
* Rational
b2) forall a. Num a => a -> a -> a
+ (Rational
a3 forall a. Num a => a -> a -> a
* Rational
b3)
fdotL :: forall (t :: * -> *).
Foldable t =>
t Rational -> t Rational -> Rational
fdotL (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList -> [Rational]
l1) (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList -> [Rational]
l2) = forall {t}. FusedOps t => [t] -> [t] -> t -> t
go [Rational]
l1 [Rational]
l2 Rational
0
where
go :: [t] -> [t] -> t -> t
go [] [] t
acc = t
acc
go [] [t]
_ t
_ = forall a. HasCallStack => String -> a
error String
"Lists not the same length"
go [t]
_ [] t
_ = forall a. HasCallStack => String -> a
error String
"Lists not the same length"
go (t
b : [t]
bs) (t
c : [t]
cs) t
acc = [t] -> [t] -> t -> t
go [t]
bs [t]
cs (forall a. FusedOps a => a -> a -> a -> a
fma t
b t
c t
acc)
instance PositC es => FusedOps (Posit es) where
fsm :: Posit es -> Posit es -> Posit es -> Posit es
fsm = forall (es :: ES).
PositC es =>
(Rational -> Rational -> Rational -> Rational)
-> Posit es -> Posit es -> Posit es -> Posit es
viaRational3 forall a. FusedOps a => a -> a -> a -> a
fsm
fma :: Posit es -> Posit es -> Posit es -> Posit es
fma = forall (es :: ES).
PositC es =>
(Rational -> Rational -> Rational -> Rational)
-> Posit es -> Posit es -> Posit es -> Posit es
viaRational3 forall a. FusedOps a => a -> a -> a -> a
fma
fam :: Posit es -> Posit es -> Posit es -> Posit es
fam = forall (es :: ES).
PositC es =>
(Rational -> Rational -> Rational -> Rational)
-> Posit es -> Posit es -> Posit es -> Posit es
viaRational3 forall a. FusedOps a => a -> a -> a -> a
fam
fmms :: Posit es -> Posit es -> Posit es -> Posit es -> Posit es
fmms = forall (es :: ES).
PositC es =>
(Rational -> Rational -> Rational -> Rational -> Rational)
-> Posit es -> Posit es -> Posit es -> Posit es -> Posit es
viaRational4 forall a. FusedOps a => a -> a -> a -> a -> a
fmms
fsum3 :: Posit es -> Posit es -> Posit es -> Posit es
fsum3 = forall (es :: ES).
PositC es =>
(Rational -> Rational -> Rational -> Rational)
-> Posit es -> Posit es -> Posit es -> Posit es
viaRational3 forall a. FusedOps a => a -> a -> a -> a
fsum3
fsum4 :: Posit es -> Posit es -> Posit es -> Posit es -> Posit es
fsum4 = forall (es :: ES).
PositC es =>
(Rational -> Rational -> Rational -> Rational -> Rational)
-> Posit es -> Posit es -> Posit es -> Posit es -> Posit es
viaRational4 forall a. FusedOps a => a -> a -> a -> a -> a
fsum4
fsumL :: forall (t :: * -> *). Foldable t => t (Posit es) -> Posit es
fsumL (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList -> [Posit es]
l) = forall (es :: ES). PositC es => IntN es -> Posit es
Posit forall a b. (a -> b) -> a -> b
$ forall (es :: ES). PositC es => Maybe Rational -> IntN es
encode @es (forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ [Posit es] -> Rational -> Rational
go [Posit es]
l Rational
0)
where
go :: [Posit es] -> Rational -> Rational
go :: [Posit es] -> Rational -> Rational
go [] !Rational
acc = Rational
acc
go ((Posit IntN es
int) : [Posit es]
xs) !Rational
acc = case forall (es :: ES). PositC es => IntN es -> Maybe Rational
decode @es IntN es
int of
Maybe Rational
Nothing -> forall a. HasCallStack => String -> a
error String
"Posit List contains NaR"
Just Rational
r -> [Posit es] -> Rational -> Rational
go [Posit es]
xs (Rational
acc forall a. Num a => a -> a -> a
+ Rational
r)
fdot3 :: Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
fdot3 = forall (es :: ES).
PositC es =>
(Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational)
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
viaRational6 forall a. FusedOps a => a -> a -> a -> a -> a -> a -> a
fdot3
fdot4 :: Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
fdot4 = forall (es :: ES).
PositC es =>
(Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational)
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
-> Posit es
viaRational8 forall a. FusedOps a => a -> a -> a -> a -> a -> a -> a -> a -> a
fdot4
fdotL :: forall (t :: * -> *).
Foldable t =>
t (Posit es) -> t (Posit es) -> Posit es
fdotL (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList -> [Posit es]
l1) (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList -> [Posit es]
l2) = forall (es :: ES). PositC es => IntN es -> Posit es
Posit forall a b. (a -> b) -> a -> b
$ forall (es :: ES). PositC es => Maybe Rational -> IntN es
encode @es (forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ [Posit es] -> [Posit es] -> Rational -> Rational
go [Posit es]
l1 [Posit es]
l2 Rational
0)
where
go :: [Posit es] -> [Posit es] -> Rational -> Rational
go [] [] !Rational
acc = Rational
acc
go [] [Posit es]
_ Rational
_ = forall a. HasCallStack => String -> a
error String
"Lists not the same length"
go [Posit es]
_ [] Rational
_ = forall a. HasCallStack => String -> a
error String
"Lists not the same length"
go ((Posit IntN es
int1) : [Posit es]
bs) ((Posit IntN es
int2) : [Posit es]
cs) !Rational
acc = case forall (es :: ES). PositC es => IntN es -> Maybe Rational
decode @es IntN es
int1 of
Maybe Rational
Nothing -> forall a. HasCallStack => String -> a
error String
"First Posit List contains NaR"
Just Rational
r1 -> case forall (es :: ES). PositC es => IntN es -> Maybe Rational
decode @es IntN es
int2 of
Maybe Rational
Nothing -> forall a. HasCallStack => String -> a
error String
"Second Posit List contains NaR"
Just Rational
r2 -> [Posit es] -> [Posit es] -> Rational -> Rational
go [Posit es]
bs [Posit es]
cs (Rational
acc forall a. Num a => a -> a -> a
+ (Rational
r1 forall a. Num a => a -> a -> a
* Rational
r2))
class Convertible a b where
convert :: a -> b
instance (PositC es1, PositC es2) => Convertible (Posit es1) (Posit es2) where
convert :: Posit es1 -> Posit es2
convert Posit es1
NaR = forall (es :: ES). PositC es => Posit es
NaR
convert (R Rational
r) = forall (es :: ES). PositC es => Rational -> Posit es
R Rational
r
#ifndef O_NO_SHOW
class AltShow a where
displayBinary :: a -> String
displayIntegral :: a -> String
displayRational :: a -> String
displayDecimal :: a -> String
instance PositC es => AltShow (Posit es) where
displayBinary :: Posit es -> String
displayBinary (Posit IntN es
int) = forall (es :: ES). PositC es => IntN es -> String
displayBin @es IntN es
int
displayIntegral :: Posit es -> String
displayIntegral (Posit IntN es
int) = forall a. Show a => a -> String
show IntN es
int
displayRational :: Posit es -> String
displayRational = forall a (es :: ES).
(Show a, PositC es) =>
(Rational -> a) -> Posit es -> String
viaShowable forall a. a -> a
id
displayDecimal :: Posit es -> String
displayDecimal = forall a (es :: ES).
(Show a, PositC es) =>
(Rational -> a) -> Posit es -> String
viaShowable (forall a b. (a, b) -> a
fstforall b c a. (b -> c) -> (a -> b) -> a -> c
.Rational -> (Scientific, Maybe Int)
fromRationalRepetendUnlimited)
viaShowable :: (Show a, PositC es) => (Rational -> a) -> Posit es -> String
viaShowable :: forall a (es :: ES).
(Show a, PositC es) =>
(Rational -> a) -> Posit es -> String
viaShowable Rational -> a
_ Posit es
NaR = String
"NaR"
viaShowable Rational -> a
f (R Rational
r) = forall a. Show a => a -> String
show forall a b. (a -> b) -> a -> b
$ Rational -> a
f Rational
r
#endif
#ifndef O_NO_READ
instance PositC es => Read (Posit es) where
readPrec :: ReadPrec (Posit es)
readPrec =
forall a. ReadPrec a -> ReadPrec a
parens forall a b. (a -> b) -> a -> b
$ do
Lexeme
x <- ReadPrec Lexeme
lexP
case Lexeme
x of
Ident String
"NaR" -> forall (m :: * -> *) a. Monad m => a -> m a
return forall (es :: ES). PositC es => Posit es
NaR
Lexeme
_ -> forall a. ReadPrec a
pfail
forall a. ReadPrec a -> ReadPrec a -> ReadPrec a
+++
do
Scientific
s <- forall a. ReadP a -> ReadPrec a
lift ReadP Scientific
scientificP
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (es :: ES). PositC es => Rational -> Posit es
R (forall a. Real a => a -> Rational
toRational Scientific
s)
readListPrec :: ReadPrec [Posit es]
readListPrec = forall a. Read a => ReadPrec [a]
readListPrecDefault
#endif
#ifndef O_NO_STORABLE_RANDOM
instance PositC es => Storable (Posit es) where
sizeOf :: Posit es -> Int
sizeOf Posit es
_ = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall (es :: ES). PositC es => Natural
nBytes @es
alignment :: Posit es -> Int
alignment Posit es
_ = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall (es :: ES). PositC es => Natural
nBytes @es
peek :: Ptr (Posit es) -> IO (Posit es)
peek Ptr (Posit es)
ptr = do
IntN es
int <- forall a. Storable a => Ptr a -> IO a
peek (forall a b. Ptr a -> Ptr b
castPtr Ptr (Posit es)
ptr :: Ptr (IntN es))
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (es :: ES). PositC es => IntN es -> Posit es
Posit IntN es
int
poke :: Ptr (Posit es) -> Posit es -> IO ()
poke Ptr (Posit es)
ptr (Posit IntN es
int) = do
forall a. Storable a => Ptr a -> a -> IO ()
poke (forall a b. Ptr a -> Ptr b
castPtr Ptr (Posit es)
ptr :: Ptr (IntN es)) IntN es
int
instance forall es. PositC es => Random (Posit es) where
random :: forall g. RandomGen g => g -> (Posit es, g)
random g
g = case forall g a. (RandomGen g, Uniform a) => g -> (a, g)
uniform g
g of
(Posit IntN es
int :: Posit es, g
g') -> (forall (es :: ES). PositC es => IntN es -> Posit es
Posit ((IntN es
int forall a. Bits a => a -> a -> a
.&. forall (es :: ES). PositC es => IntN es
maskFraction @es) forall a. Bits a => a -> a -> a
.|. IntN es
patt) forall a. Num a => a -> a -> a
- Posit es
1.0, g
g')
where
(Posit IntN es
patt) = Posit es
1.0 :: Posit es
randomR :: forall g. RandomGen g => (Posit es, Posit es) -> g -> (Posit es, g)
randomR (Posit es
lo,Posit es
hi) g
g
| Posit es
lo forall a. Ord a => a -> a -> Bool
> Posit es
hi = forall a g. (Random a, RandomGen g) => (a, a) -> g -> (a, g)
randomR (Posit es
hi,Posit es
lo) g
g
| Bool
otherwise = case forall a g. (Random a, RandomGen g) => g -> (a, g)
random g
g of
(Posit es
p,g
g') -> let scaled_p :: Posit es
scaled_p = (Posit es
hi forall a. Num a => a -> a -> a
- Posit es
lo) forall a. Num a => a -> a -> a
* Posit es
p forall a. Num a => a -> a -> a
+ Posit es
lo
in (Posit es
scaled_p, g
g')
instance PositC es => Uniform (Posit es) where
uniformM :: forall g (m :: * -> *). StatefulGen g m => g -> m (Posit es)
uniformM g
g = do
IntN es
int <- forall a g (m :: * -> *). (Uniform a, StatefulGen g m) => g -> m a
uniformM g
g
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (es :: ES). PositC es => IntN es -> Posit es
Posit IntN es
int
maskFraction :: forall es. PositC es => IntN es
maskFraction :: forall (es :: ES). PositC es => IntN es
maskFraction =
let twoRegimeBits :: Natural
twoRegimeBits = Natural
2
sreSize :: Natural
sreSize = forall (es :: ES). PositC es => Natural
signBitSize @es forall a. Num a => a -> a -> a
+ Natural
twoRegimeBits forall a. Num a => a -> a -> a
+ forall (es :: ES). PositC es => Natural
exponentSize @es
in (IntN es
1 forall a. Bits a => a -> Int -> a
`shiftL` forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall (es :: ES). PositC es => Natural
nBits @es forall a. Num a => a -> a -> a
- Natural
sreSize) forall a. Num a => a -> a -> a
- IntN es
1)
#endif
instance PositC es => RealFrac (Posit es) where
properFraction :: forall b. Integral b => Posit es -> (b, Posit es)
properFraction = forall (es :: ES) a.
PositC es =>
String -> (Rational -> (a, Rational)) -> Posit es -> (a, Posit es)
viaRationalErrTrunkation String
"NaR value is not a RealFrac" forall a b. (RealFrac a, Integral b) => a -> (b, a)
properFraction
viaRationalErrTrunkation :: PositC es => String -> (Rational -> (a, Rational)) -> Posit es -> (a, Posit es)
viaRationalErrTrunkation :: forall (es :: ES) a.
PositC es =>
String -> (Rational -> (a, Rational)) -> Posit es -> (a, Posit es)
viaRationalErrTrunkation String
err Rational -> (a, Rational)
_ Posit es
NaR = forall a. HasCallStack => String -> a
error String
err
viaRationalErrTrunkation String
_ Rational -> (a, Rational)
f (R Rational
r) =
let (a
int, Rational
r') = Rational -> (a, Rational)
f Rational
r
in (a
int, forall (es :: ES). PositC es => Rational -> Posit es
R Rational
r')
instance (Floating (Posit es), PositC es) => RealFloat (Posit es) where
isIEEE :: Posit es -> Bool
isIEEE Posit es
_ = Bool
False
isDenormalized :: Posit es -> Bool
isDenormalized Posit es
_ = Bool
False
isNegativeZero :: Posit es -> Bool
isNegativeZero Posit es
_ = Bool
False
isNaN :: Posit es -> Bool
isNaN Posit es
NaR = Bool
True
isNaN Posit es
_ = Bool
False
isInfinite :: Posit es -> Bool
isInfinite Posit es
NaR = Bool
True
isInfinite Posit es
_ = Bool
False
atan2 :: Posit es -> Posit es -> Posit es
atan2 Posit es
NaR Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
atan2 Posit es
_ Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
atan2 Posit es
y Posit es
x
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
0 Bool -> Bool -> Bool
&& Posit es
y forall a. Eq a => a -> a -> Bool
== Posit es
0 = forall (es :: ES). PositC es => Posit es
NaR
| Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
0 = forall a. Floating a => a -> a
atan (Posit es
yforall a. Fractional a => a -> a -> a
/Posit es
x)
| Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0 Bool -> Bool -> Bool
&& Posit es
y forall a. Ord a => a -> a -> Bool
>= Posit es
0 = forall a. Floating a => a -> a
atan (Posit es
yforall a. Fractional a => a -> a -> a
/Posit es
x) forall a. Num a => a -> a -> a
+ forall a. Floating a => a
pi
| Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0 Bool -> Bool -> Bool
&& Posit es
y forall a. Ord a => a -> a -> Bool
< Posit es
0 = forall a. Floating a => a -> a
atan (Posit es
yforall a. Fractional a => a -> a -> a
/Posit es
x) forall a. Num a => a -> a -> a
- forall a. Floating a => a
pi
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
0 Bool -> Bool -> Bool
&& Posit es
y forall a. Ord a => a -> a -> Bool
> Posit es
0 = forall a. Floating a => a
pi forall a. Fractional a => a -> a -> a
/ Posit es
2
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
0 Bool -> Bool -> Bool
&& Posit es
y forall a. Ord a => a -> a -> Bool
< Posit es
0 = forall a. Num a => a -> a
negate forall a b. (a -> b) -> a -> b
$ forall a. Floating a => a
pi forall a. Fractional a => a -> a -> a
/ Posit es
2
| Bool
otherwise = forall a. HasCallStack => String -> a
error String
"What!?!?!"
floatRadix :: Posit es -> Integer
floatRadix Posit es
_ = Integer
2
floatDigits :: Posit es -> Int
floatDigits Posit es
_ = forall a. HasCallStack => a
undefined
floatRange :: Posit es -> (Int, Int)
floatRange Posit es
_ = (forall a. Num a => a -> a
negate Int
maxExponent, Int
maxExponent)
where
maxExponent :: Int
maxExponent = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ (forall (es :: ES). PositC es => Natural
nBytes @es) forall a. Num a => a -> a -> a
* ((forall (es :: ES). PositC es => Natural
nBits @es) forall a. Num a => a -> a -> a
- Natural
2)
decodeFloat :: Posit es -> (Integer, Int)
decodeFloat = forall a. HasCallStack => a
undefined
encodeFloat :: Integer -> Int -> Posit es
encodeFloat = forall a. HasCallStack => a
undefined
instance PositF es => Floating (Posit es) where
pi :: Posit es
pi = forall (es :: ES). PositC es => Posit es
approx_pi
exp :: Posit es -> Posit es
exp = forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext forall (es :: ES). PositC es => Posit es -> Posit es
approx_exp
log :: Posit es -> Posit es
log = forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext forall (es :: ES). PositC es => Posit es -> Posit es
approx_log
Posit es
x ** :: Posit es -> Posit es -> Posit es
** Posit es
y = forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es) -> Posit (Next es))
-> Posit es -> Posit es -> Posit es
hiRezNext2 forall (es :: ES). PositC es => Posit es -> Posit es -> Posit es
approx_pow Posit es
x Posit es
y
sin :: Posit es -> Posit es
sin = forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext forall (es :: ES). PositC es => Posit es -> Posit es
approx_sin
cos :: Posit es -> Posit es
cos = forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext forall (es :: ES). PositC es => Posit es -> Posit es
approx_cos
asin :: Posit es -> Posit es
asin = forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext forall (es :: ES). PositC es => Posit es -> Posit es
approx_asin
acos :: Posit es -> Posit es
acos = forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext forall (es :: ES). PositC es => Posit es -> Posit es
approx_acos
atan :: Posit es -> Posit es
atan = forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext forall (es :: ES). PositC es => Posit es -> Posit es
approx_atan
sinh :: Posit es -> Posit es
sinh = forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext forall (es :: ES). PositC es => Posit es -> Posit es
approx_sinh
cosh :: Posit es -> Posit es
cosh = forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext forall (es :: ES). PositC es => Posit es -> Posit es
approx_cosh
asinh :: Posit es -> Posit es
asinh = forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext forall (es :: ES). PositC es => Posit es -> Posit es
approx_asinh
acosh :: Posit es -> Posit es
acosh = forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext forall (es :: ES). PositC es => Posit es -> Posit es
approx_acosh
atanh :: Posit es -> Posit es
atanh = forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext forall (es :: ES). PositC es => Posit es -> Posit es
approx_atanh
hiRezNext :: forall es. PositF es => (Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext :: forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es
hiRezNext Posit (Next es) -> Posit (Next es)
f Posit es
x = forall a b. Convertible a b => a -> b
convert (Posit (Next es) -> Posit (Next es)
f (forall a b. Convertible a b => a -> b
convert Posit es
x) :: Posit (Next es)) :: Posit es
hiRezMax :: forall es. (PositC es, PositC (Max es)) => (Posit (Max es) -> Posit (Max es)) -> Posit es -> Posit es
hiRezMax :: forall (es :: ES).
(PositC es, PositC (Max es)) =>
(Posit (Max es) -> Posit (Max es)) -> Posit es -> Posit es
hiRezMax Posit (Max es) -> Posit (Max es)
f Posit es
x = forall a b. Convertible a b => a -> b
convert (Posit (Max es) -> Posit (Max es)
f (forall a b. Convertible a b => a -> b
convert Posit es
x) :: Posit (Max es)) :: Posit es
hiRezNext2 :: forall es. PositF es => (Posit (Next es) -> Posit (Next es) -> Posit (Next es)) -> Posit es -> Posit es -> Posit es
hiRezNext2 :: forall (es :: ES).
PositF es =>
(Posit (Next es) -> Posit (Next es) -> Posit (Next es))
-> Posit es -> Posit es -> Posit es
hiRezNext2 Posit (Next es) -> Posit (Next es) -> Posit (Next es)
f Posit es
x Posit es
y = forall a b. Convertible a b => a -> b
convert (Posit (Next es) -> Posit (Next es) -> Posit (Next es)
f (forall a b. Convertible a b => a -> b
convert Posit es
x :: Posit (Next es)) (forall a b. Convertible a b => a -> b
convert Posit es
y :: Posit (Next es)) ) :: Posit es
hiRezMax2 :: forall es. (PositC es, PositC (Max es)) => (Posit (Max es) -> Posit (Max es) -> Posit (Max es)) -> Posit es -> Posit es -> Posit es
hiRezMax2 :: forall (es :: ES).
(PositC es, PositC (Max es)) =>
(Posit (Max es) -> Posit (Max es) -> Posit (Max es))
-> Posit es -> Posit es -> Posit es
hiRezMax2 Posit (Max es) -> Posit (Max es) -> Posit (Max es)
f Posit es
x Posit es
y = forall a b. Convertible a b => a -> b
convert (Posit (Max es) -> Posit (Max es) -> Posit (Max es)
f (forall a b. Convertible a b => a -> b
convert Posit es
x :: Posit (Max es)) (forall a b. Convertible a b => a -> b
convert Posit es
y :: Posit (Max es)) ) :: Posit es
approx_pi :: PositC es => Posit es
approx_pi :: forall (es :: ES). PositC es => Posit es
approx_pi = Posit es
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446
approx_e :: PositC es => Posit es
approx_e :: forall (es :: ES). PositC es => Posit es
approx_e = Posit es
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135
approx_exp :: forall es. PositC es => Posit es -> Posit es
approx_exp :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_exp (R Rational
bx) = forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall (es :: ES). PositC es => Natural
uSeed @es)forall a b. (Fractional a, Integral b) => a -> b -> a
^^Integer
m forall a. Num a => a -> a -> a
* (forall (es :: ES). PositC es => Posit es -> Posit es
taylor_approx_expm1 (forall (es :: ES). PositC es => Rational -> Posit es
R Rational
c forall a. Num a => a -> a -> a
* forall (es :: ES). PositC es => Posit es
log_USeed) forall a. Num a => a -> a -> a
+ Posit es
1)
where
(Integer
m,Rational
c) = forall a b. (RealFrac a, Integral b) => a -> (b, a)
properFraction forall a b. (a -> b) -> a -> b
$ Rational
bx forall a. Fractional a => a -> a -> a
/ Rational
luS
R Rational
luS = forall (es :: ES). PositC es => Posit es
log_USeed @es
log_USeed :: forall es. PositC es => Posit es
log_USeed :: forall (es :: ES). PositC es => Posit es
log_USeed = forall (es :: ES). PositC es => Posit es -> Posit es
approx_log forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall (es :: ES). PositC es => Natural
uSeed @es)
approx_log :: PositC es => Posit es -> Posit es
approx_log :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_log = forall (es :: ES).
PositC es =>
(Posit es -> Posit es) -> Posit es -> Posit es
funLogDomainReduction forall (es :: ES). PositC es => Posit es -> Posit es
funLogTaylor
approx_pow :: (PositC es) => Posit es -> Posit es -> Posit es
Posit es
NaR approx_pow :: forall (es :: ES). PositC es => Posit es -> Posit es -> Posit es
`approx_pow` Posit es
_ = forall (es :: ES). PositC es => Posit es
NaR
Posit es
_ `approx_pow` Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
approx_pow Posit es
0 Posit es
y
| Posit es
y forall a. Ord a => a -> a -> Bool
< Posit es
0 = forall (es :: ES). PositC es => Posit es
NaR
| Posit es
y forall a. Eq a => a -> a -> Bool
== Posit es
0 = forall (es :: ES). PositC es => Posit es
NaR
| Posit es
y forall a. Ord a => a -> a -> Bool
> Posit es
0 = Posit es
0
approx_pow Posit es
x Posit es
y
| Posit es
y forall a. Ord a => a -> a -> Bool
< Posit es
0 = forall a. Fractional a => a -> a
recip forall a b. (a -> b) -> a -> b
$ forall (es :: ES). PositC es => Posit es -> Posit es -> Posit es
approx_pow Posit es
x (forall a. Num a => a -> a
negate Posit es
y)
| Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0 =
let (Integer
int,Posit es
rem) = forall a b. (RealFrac a, Integral b) => a -> (b, a)
properFraction Posit es
y
in if Posit es
rem forall a. Eq a => a -> a -> Bool
== Posit es
0
then Posit es
xforall a b. (Fractional a, Integral b) => a -> b -> a
^^Integer
int
else forall (es :: ES). PositC es => Posit es
NaR
| Bool
otherwise = forall (es :: ES). PositC es => Posit es -> Posit es
approx_exp forall a b. (a -> b) -> a -> b
$ Posit es
y forall a. Num a => a -> a -> a
* forall (es :: ES). PositC es => Posit es -> Posit es
approx_log Posit es
x
approx_sin :: forall es. PositC es => Posit es -> Posit es
approx_sin :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_sin Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
approx_sin Posit es
0 = Posit es
0
approx_sin (R Rational
x) = forall (es :: ES). PositC es => Posit es -> Posit es
normalizedSine (forall (es :: ES). PositC es => Rational -> Posit es
R Rational
x')
where
(Integer
_, Rational
x') = forall a b. (RealFrac a, Integral b) => a -> (b, a)
properFraction forall a b. (a -> b) -> a -> b
$ Rational
x forall a. Fractional a => a -> a -> a
/ Rational
twoPi
approx_cos :: forall es. PositC es => Posit es -> Posit es
approx_cos :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_cos Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
approx_cos Posit es
0 = Posit es
1
approx_cos (R Rational
x) = forall (es :: ES). PositC es => Posit es -> Posit es
normalizedCosine (forall (es :: ES). PositC es => Rational -> Posit es
R Rational
x')
where
(Integer
_, Rational
x') = forall a b. (RealFrac a, Integral b) => a -> (b, a)
properFraction forall a b. (a -> b) -> a -> b
$ Rational
x forall a. Fractional a => a -> a -> a
/ Rational
twoPi
approx_asin :: PositC es => Posit es -> Posit es
approx_asin :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_asin Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
approx_asin Posit es
x
| forall a. Num a => a -> a
abs Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
1 = forall (es :: ES). PositC es => Posit es
NaR
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
1 = forall (es :: ES). PositC es => Posit es
approx_piforall a. Fractional a => a -> a -> a
/Posit es
2
| Posit es
x forall a. Eq a => a -> a -> Bool
== -Posit es
1 = -forall (es :: ES). PositC es => Posit es
approx_piforall a. Fractional a => a -> a -> a
/Posit es
2
| Bool
otherwise = forall (es :: ES). PositC es => Posit es -> Posit es
approx_atan Posit es
w
where
w :: Posit es
w = Posit es
x forall a. Fractional a => a -> a -> a
/ forall (es :: ES). PositC es => Posit es -> Posit es
approx_sqrt (Posit es
1 forall a. Num a => a -> a -> a
- Posit es
xforall a b. (Num a, Integral b) => a -> b -> a
^Integer
2)
approx_acos :: PositC es => Posit es -> Posit es
approx_acos :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_acos Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
approx_acos Posit es
x
| forall a. Num a => a -> a
abs Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
1 = forall (es :: ES). PositC es => Posit es
NaR
| Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0 = forall (es :: ES). PositC es => Posit es
approx_pi forall a. Num a => a -> a -> a
+ forall (es :: ES). PositC es => Posit es -> Posit es
approx_atan Posit es
invw
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
0 = forall (es :: ES). PositC es => Posit es
approx_piforall a. Fractional a => a -> a -> a
/Posit es
2
| Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
0 = forall (es :: ES). PositC es => Posit es -> Posit es
approx_atan Posit es
invw
| Bool
otherwise = forall a. HasCallStack => String -> a
error String
"Prove it covers for Rational Numbers."
where
invw :: Posit es
invw = forall (es :: ES). PositC es => Posit es -> Posit es
approx_sqrt (Posit es
1 forall a. Num a => a -> a -> a
- Posit es
xforall a b. (Num a, Integral b) => a -> b -> a
^Integer
2) forall a. Fractional a => a -> a -> a
/ Posit es
x
approx_atan :: PositC es => Posit es -> Posit es
approx_atan :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_atan Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
approx_atan Posit es
x
| forall a. Num a => a -> a
abs Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
1forall a. Fractional a => a -> a -> a
/Posit es
2forall a b. (Num a, Integral b) => a -> b -> a
^Integer
122 = Posit es
x
| Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0 = forall a. Num a => a -> a
negateforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall (es :: ES). PositC es => Posit es -> Posit es
approx_atan forall a b. (a -> b) -> a -> b
$ forall a. Num a => a -> a
negate Posit es
x
| Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
1 = forall (es :: ES). PositC es => Posit es
approx_piforall a. Fractional a => a -> a -> a
/Posit es
2 forall a. Num a => a -> a -> a
- forall (es :: ES). PositC es => Posit es -> Posit es
approx_atan (forall a. Fractional a => a -> a
recip Posit es
x)
| Posit es
x forall a. Ord a => a -> a -> Bool
> forall (es :: ES). PositC es => Posit es
twoMsqrt3 = forall (es :: ES). PositC es => Posit es
approx_piforall a. Fractional a => a -> a -> a
/Posit es
6 forall a. Num a => a -> a -> a
+ forall (es :: ES). PositC es => Posit es -> Posit es
approx_atan ((forall (es :: ES). PositC es => Posit es
sqrt3 forall a. Num a => a -> a -> a
* Posit es
x forall a. Num a => a -> a -> a
- Posit es
1)forall a. Fractional a => a -> a -> a
/(forall (es :: ES). PositC es => Posit es
sqrt3 forall a. Num a => a -> a -> a
+ Posit es
x))
| Bool
otherwise = forall (es :: ES). PositC es => Posit es -> Posit es
taylor_approx_atan Posit es
x
approx_sinh :: PositC es => Posit es -> Posit es
approx_sinh :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_sinh Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
approx_sinh Posit es
x = (forall (es :: ES). PositC es => Posit es -> Posit es
approx_exp Posit es
x forall a. Num a => a -> a -> a
- forall (es :: ES). PositC es => Posit es -> Posit es
approx_exp (forall a. Num a => a -> a
negate Posit es
x))forall a. Fractional a => a -> a -> a
/Posit es
2
approx_cosh :: PositC es => Posit es -> Posit es
approx_cosh :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_cosh Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
approx_cosh Posit es
x = (forall (es :: ES). PositC es => Posit es -> Posit es
approx_exp Posit es
x forall a. Num a => a -> a -> a
+ forall (es :: ES). PositC es => Posit es -> Posit es
approx_exp (forall a. Num a => a -> a
negate Posit es
x))forall a. Fractional a => a -> a -> a
/Posit es
2
approx_asinh :: PositC es => Posit es -> Posit es
approx_asinh :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_asinh Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
approx_asinh Posit es
x = forall (es :: ES). PositC es => Posit es -> Posit es
approx_log forall a b. (a -> b) -> a -> b
$ Posit es
x forall a. Num a => a -> a -> a
+ forall (es :: ES). PositC es => Posit es -> Posit es
approx_sqrt (Posit es
xforall a b. (Num a, Integral b) => a -> b -> a
^Integer
2 forall a. Num a => a -> a -> a
+ Posit es
1)
approx_acosh :: PositC es => Posit es -> Posit es
approx_acosh :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_acosh Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
approx_acosh Posit es
x
| Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
1 = forall (es :: ES). PositC es => Posit es
NaR
| Bool
otherwise = forall (es :: ES). PositC es => Posit es -> Posit es
approx_log forall a b. (a -> b) -> a -> b
$ Posit es
x forall a. Num a => a -> a -> a
+ forall (es :: ES). PositC es => Posit es -> Posit es
approx_sqrt (Posit es
xforall a b. (Num a, Integral b) => a -> b -> a
^Integer
2 forall a. Num a => a -> a -> a
- Posit es
1)
approx_atanh :: forall es. PositC es => Posit es -> Posit es
approx_atanh :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_atanh Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
approx_atanh Posit es
x
| forall a. Num a => a -> a
abs Posit es
x forall a. Ord a => a -> a -> Bool
>= Posit es
1 = forall (es :: ES). PositC es => Posit es
NaR
| Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0 = forall a. Num a => a -> a
negateforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall (es :: ES). PositC es => Posit es -> Posit es
approx_atanhforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall a. Num a => a -> a
negate forall a b. (a -> b) -> a -> b
$ Posit es
x
| Bool
otherwise = Posit es
0.5 forall a. Num a => a -> a -> a
* forall (es :: ES). PositC es => Posit es -> Posit es
approx_log ((Posit es
1forall a. Num a => a -> a -> a
+Posit es
t) forall a. Fractional a => a -> a -> a
/ (Posit es
1forall a. Num a => a -> a -> a
-Posit es
t)) forall a. Num a => a -> a -> a
- (forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
ex forall a. Fractional a => a -> a -> a
/ Posit es
2) forall a. Num a => a -> a -> a
* forall (es :: ES). PositC es => Posit es
lnOf2
where
(Integer
ex, Posit es
sig) = (Integer
int forall a. Num a => a -> a -> a
* forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer
2forall a b. (Num a, Integral b) => a -> b -> a
^(forall (es :: ES). PositC es => Natural
exponentSize @es)) forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral Natural
nat forall a. Num a => a -> a -> a
+ Integer
1, forall a. Fractional a => Rational -> a
fromRational Rational
rat forall a. Fractional a => a -> a -> a
/ Posit es
2)
(Bool
_,Integer
int,Natural
nat,Rational
rat) = (forall (es :: ES).
PositC es =>
Rational -> (Bool, Integer, Natural, Rational)
posit2TupPosit @es)forall b c a. (b -> c) -> (a -> b) -> a -> c
.forall a. Real a => a -> Rational
toRational forall a b. (a -> b) -> a -> b
$ Posit es
x'
x' :: Posit es
x' = Posit es
1 forall a. Num a => a -> a -> a
- Posit es
x
t :: Posit es
t = (Posit es
2 forall a. Num a => a -> a -> a
- Posit es
sig forall a. Num a => a -> a -> a
- Posit es
x') forall a. Fractional a => a -> a -> a
/ (Posit es
2 forall a. Num a => a -> a -> a
+ Posit es
sig forall a. Num a => a -> a -> a
- Posit es
x')
normalizedSine :: PositC es => Posit es -> Posit es
normalizedSine :: forall (es :: ES). PositC es => Posit es -> Posit es
normalizedSine Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
normalizedSine Posit es
x
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
0 = Posit es
0
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
0.25 = Posit es
1
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
0.5 = Posit es
0
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
0.75 = -Posit es
1
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
1 = Posit es
0
| Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0 = forall a. Num a => a -> a
negateforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall (es :: ES). PositC es => Posit es -> Posit es
normalizedSineforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall a. Num a => a -> a
negate forall a b. (a -> b) -> a -> b
$ Posit es
x
| Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
1 =
let (Integer
_,Posit es
rem) = forall a b. (RealFrac a, Integral b) => a -> (b, a)
properFraction Posit es
x
in forall (es :: ES). PositC es => Posit es -> Posit es
normalizedSine Posit es
rem
| Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
0.75 Bool -> Bool -> Bool
&& Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
1 = forall a. Num a => a -> a
negateforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall (es :: ES). PositC es => Posit es -> Posit es
normalizedSine forall a b. (a -> b) -> a -> b
$ Posit es
1 forall a. Num a => a -> a -> a
- Posit es
x
| Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
0.5 Bool -> Bool -> Bool
&& Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0.75 = forall a. Num a => a -> a
negateforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall (es :: ES). PositC es => Posit es -> Posit es
normalizedSine forall a b. (a -> b) -> a -> b
$ Posit es
x forall a. Num a => a -> a -> a
- Posit es
0.5
| Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
0.25 Bool -> Bool -> Bool
&& Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0.5 = forall (es :: ES). PositC es => Posit es -> Posit es
normalizedSine forall a b. (a -> b) -> a -> b
$ Posit es
0.5 forall a. Num a => a -> a -> a
- Posit es
x
| Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
0.125 Bool -> Bool -> Bool
&& Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0.25 = forall (es :: ES). PositC es => Posit es -> Posit es
tuma_approx_cos forall a b. (a -> b) -> a -> b
$ Posit es
2forall a. Num a => a -> a -> a
*forall (es :: ES). PositC es => Posit es
approx_pi forall a. Num a => a -> a -> a
* (Posit es
0.25 forall a. Num a => a -> a -> a
- Posit es
x)
| Bool
otherwise = forall (es :: ES). PositC es => Posit es -> Posit es
tuma_approx_sin forall a b. (a -> b) -> a -> b
$ Posit es
2forall a. Num a => a -> a -> a
*forall (es :: ES). PositC es => Posit es
approx_pi forall a. Num a => a -> a -> a
* Posit es
x
normalizedCosine :: PositC es => Posit es -> Posit es
normalizedCosine :: forall (es :: ES). PositC es => Posit es -> Posit es
normalizedCosine Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
normalizedCosine Posit es
x
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
0 = Posit es
1
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
0.25 = Posit es
0
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
0.5 = -Posit es
1
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
0.75 = Posit es
0
| Posit es
x forall a. Eq a => a -> a -> Bool
== Posit es
1 = Posit es
1
| Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0 = forall (es :: ES). PositC es => Posit es -> Posit es
normalizedCosineforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall a. Num a => a -> a
negate forall a b. (a -> b) -> a -> b
$ Posit es
x
| Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
1 =
let (Integer
_,Posit es
rem) = forall a b. (RealFrac a, Integral b) => a -> (b, a)
properFraction Posit es
x
in forall (es :: ES). PositC es => Posit es -> Posit es
normalizedCosine Posit es
rem
| Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
0.75 Bool -> Bool -> Bool
&& Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
1 = forall (es :: ES). PositC es => Posit es -> Posit es
normalizedCosine forall a b. (a -> b) -> a -> b
$ Posit es
1 forall a. Num a => a -> a -> a
- Posit es
x
| Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
0.5 Bool -> Bool -> Bool
&& Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0.75 = forall a. Num a => a -> a
negateforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall (es :: ES). PositC es => Posit es -> Posit es
normalizedCosine forall a b. (a -> b) -> a -> b
$ Posit es
x forall a. Num a => a -> a -> a
- Posit es
0.5
| Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
0.25 Bool -> Bool -> Bool
&& Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0.5 = forall a. Num a => a -> a
negateforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall (es :: ES). PositC es => Posit es -> Posit es
normalizedCosine forall a b. (a -> b) -> a -> b
$ Posit es
0.5 forall a. Num a => a -> a -> a
- Posit es
x
| Posit es
x forall a. Ord a => a -> a -> Bool
> Posit es
0.125 Bool -> Bool -> Bool
&& Posit es
x forall a. Ord a => a -> a -> Bool
< Posit es
0.25 = forall (es :: ES). PositC es => Posit es -> Posit es
tuma_approx_sin forall a b. (a -> b) -> a -> b
$ Posit es
2forall a. Num a => a -> a -> a
*forall (es :: ES). PositC es => Posit es
approx_pi forall a. Num a => a -> a -> a
* (Posit es
0.25 forall a. Num a => a -> a -> a
- Posit es
x)
| Bool
otherwise = forall (es :: ES). PositC es => Posit es -> Posit es
tuma_approx_cos forall a b. (a -> b) -> a -> b
$ Posit es
2forall a. Num a => a -> a -> a
*forall (es :: ES). PositC es => Posit es
approx_pi forall a. Num a => a -> a -> a
* Posit es
x
funLogDomainReduction :: forall es. PositC es => (Posit es -> Posit es) -> Posit es -> Posit es
funLogDomainReduction :: forall (es :: ES).
PositC es =>
(Posit es -> Posit es) -> Posit es -> Posit es
funLogDomainReduction Posit es -> Posit es
_ Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
funLogDomainReduction Posit es -> Posit es
_ Posit es
1 = Posit es
0
funLogDomainReduction Posit es -> Posit es
f Posit es
x
| Posit es
x forall a. Ord a => a -> a -> Bool
<= Posit es
0 = forall (es :: ES). PositC es => Posit es
NaR
| Bool
otherwise = Posit es -> Posit es
f Posit es
sig forall a. Num a => a -> a -> a
+ (forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
ex forall a. Num a => a -> a -> a
* forall (es :: ES). PositC es => Posit es
lnOf2)
where
(Integer
ex, Posit es
sig) = (Integer
int forall a. Num a => a -> a -> a
* forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer
2forall a b. (Num a, Integral b) => a -> b -> a
^(forall (es :: ES). PositC es => Natural
exponentSize @es)) forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral Natural
nat forall a. Num a => a -> a -> a
+ Integer
1, forall a. Fractional a => Rational -> a
fromRational Rational
rat forall a. Fractional a => a -> a -> a
/ Posit es
2)
(Bool
_,Integer
int,Natural
nat,Rational
rat) = (forall (es :: ES).
PositC es =>
Rational -> (Bool, Integer, Natural, Rational)
posit2TupPosit @es)forall b c a. (b -> c) -> (a -> b) -> a -> c
.forall a. Real a => a -> Rational
toRational forall a b. (a -> b) -> a -> b
$ Posit es
x
funLogTaylor :: forall es. PositC es => Posit es -> Posit es
funLogTaylor :: forall (es :: ES). PositC es => Posit es -> Posit es
funLogTaylor Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
funLogTaylor Posit es
1 = Posit es
0
funLogTaylor Posit es
x | Posit es
x forall a. Ord a => a -> a -> Bool
<= Posit es
0 = forall (es :: ES). PositC es => Posit es
NaR
funLogTaylor Posit es
x
| Posit es
x forall a. Ord a => a -> a -> Bool
<= Posit es
2 = Natural -> Posit es -> Posit es
go Natural
1 Posit es
0
| Bool
otherwise = forall a. HasCallStack => String -> a
error String
"The funLogTaylor algorithm is being used improperly"
where
go :: Natural -> Posit es -> Posit es
go :: Natural -> Posit es -> Posit es
go !Natural
k !Posit es
acc
| Posit es
acc forall a. Eq a => a -> a -> Bool
== (Posit es
acc forall a. Num a => a -> a -> a
+ Natural -> Posit es
term Natural
k) = Posit es
acc
| Bool
otherwise = Natural -> Posit es -> Posit es
go (Natural
k forall a. Num a => a -> a -> a
+ Natural
1) (Posit es
acc forall a. Num a => a -> a -> a
+ Natural -> Posit es
term Natural
k)
term :: Natural -> Posit es
term :: Natural -> Posit es
term Natural
k = (-Posit es
1)forall a b. (Num a, Integral b) => a -> b -> a
^(Natural
kforall a. Num a => a -> a -> a
+Natural
1) forall a. Num a => a -> a -> a
* (Posit es
x forall a. Num a => a -> a -> a
- Posit es
1)forall a b. (Num a, Integral b) => a -> b -> a
^Natural
k forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral Natural
k
taylor_approx_atan :: forall es. PositC es => Posit es -> Posit es
taylor_approx_atan :: forall (es :: ES). PositC es => Posit es -> Posit es
taylor_approx_atan Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
taylor_approx_atan Posit es
x = Integer -> Posit es -> Posit es
go Integer
0 Posit es
0
where
go :: Integer -> Posit es -> Posit es
go !Integer
k !Posit es
acc
| Posit es
acc forall a. Eq a => a -> a -> Bool
== (Posit es
acc forall a. Num a => a -> a -> a
+ Integer -> Posit es
term Integer
k) = Posit es
acc
| Bool
otherwise = Integer -> Posit es -> Posit es
go (Integer
kforall a. Num a => a -> a -> a
+Integer
1) (Posit es
acc forall a. Num a => a -> a -> a
+ Integer -> Posit es
term Integer
k)
term :: Integer -> Posit es
term :: Integer -> Posit es
term Integer
k = ((-Posit es
1)forall a b. (Num a, Integral b) => a -> b -> a
^Integer
k forall a. Num a => a -> a -> a
* Posit es
xforall a b. (Num a, Integral b) => a -> b -> a
^(Integer
2 forall a. Num a => a -> a -> a
* Integer
k forall a. Num a => a -> a -> a
+ Integer
1)) forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer
2 forall a. Num a => a -> a -> a
* Integer
k forall a. Num a => a -> a -> a
+ Integer
1)
taylor_approx_expm1 :: forall es. PositC es => Posit es -> Posit es
taylor_approx_expm1 :: forall (es :: ES). PositC es => Posit es -> Posit es
taylor_approx_expm1 Posit es
x = Posit es -> [Posit es] -> Posit es
go Posit es
0 [Posit es
xforall a b. (Num a, Integral b) => a -> b -> a
^Natural
n forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral (Natural -> Natural
fac Natural
n) | Natural
n <- [Natural
1..]]
where
go :: Posit es -> [Posit es] -> Posit es
go :: Posit es -> [Posit es] -> Posit es
go !Posit es
acc (Posit es
h:[Posit es]
t) | Posit es
acc forall a. Eq a => a -> a -> Bool
== Posit es
acc forall a. Num a => a -> a -> a
+ Posit es
h = Posit es
acc
| Bool
otherwise = Posit es -> [Posit es] -> Posit es
go (Posit es
acc forall a. Num a => a -> a -> a
+ Posit es
h) [Posit es]
t
tuma_approx_cos :: forall es. PositC es => Posit es -> Posit es
tuma_approx_cos :: forall (es :: ES). PositC es => Posit es -> Posit es
tuma_approx_cos Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
tuma_approx_cos Posit es
z = Natural -> Posit es -> Posit es
go Natural
19 Posit es
1
where
go :: Natural -> Posit es -> Posit es
go :: Natural -> Posit es -> Posit es
go Natural
1 !Posit es
acc = Posit es
acc
go !Natural
k !Posit es
acc = Natural -> Posit es -> Posit es
go (Natural
kforall a. Num a => a -> a -> a
-Natural
1) (Posit es
1 forall a. Num a => a -> a -> a
- (Posit es
zforall a b. (Num a, Integral b) => a -> b -> a
^Integer
2 forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral ((Natural
2forall a. Num a => a -> a -> a
*Natural
kforall a. Num a => a -> a -> a
-Natural
3)forall a. Num a => a -> a -> a
*(Natural
2forall a. Num a => a -> a -> a
*Natural
kforall a. Num a => a -> a -> a
-Natural
2))) forall a. Num a => a -> a -> a
* Posit es
acc)
tuma_approx_sin :: forall es. PositC es => Posit es -> Posit es
tuma_approx_sin :: forall (es :: ES). PositC es => Posit es -> Posit es
tuma_approx_sin Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
tuma_approx_sin Posit es
z = Natural -> Posit es -> Posit es
go Natural
19 Posit es
1
where
go :: Natural -> Posit es -> Posit es
go :: Natural -> Posit es -> Posit es
go Natural
1 !Posit es
acc = Posit es
z forall a. Num a => a -> a -> a
* Posit es
acc
go !Natural
k !Posit es
acc = Natural -> Posit es -> Posit es
go (Natural
kforall a. Num a => a -> a -> a
-Natural
1) (Posit es
1 forall a. Num a => a -> a -> a
- (Posit es
zforall a b. (Num a, Integral b) => a -> b -> a
^Integer
2 forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral ((Natural
2forall a. Num a => a -> a -> a
*Natural
kforall a. Num a => a -> a -> a
-Natural
2)forall a. Num a => a -> a -> a
*(Natural
2forall a. Num a => a -> a -> a
*Natural
kforall a. Num a => a -> a -> a
-Natural
1))) forall a. Num a => a -> a -> a
* Posit es
acc)
class AltFloating p where
eps :: p
phi :: p
gamma :: p -> p
sinc :: p -> p
expm1 :: p -> p
hypot2 :: p -> p -> p
hypot3 :: p -> p -> p -> p
hypot4 :: p -> p -> p -> p -> p
instance PositF es => AltFloating (Posit es) where
phi :: Posit es
phi = Posit es
1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374847540880753868917521266338
eps :: Posit es
eps = forall a. Enum a => a -> a
succ Posit es
1.0 forall a. Num a => a -> a -> a
- Posit es
1.0
gamma :: Posit es -> Posit es
gamma = forall (es :: ES). PositC es => Posit es -> Posit es
approx_gamma
sinc :: Posit es -> Posit es
sinc = forall (es :: ES). PositC es => Posit es -> Posit es
approx_sinc
expm1 :: Posit es -> Posit es
expm1 Posit es
x =
let b :: Posit es
b = forall (es :: ES). PositC es => Posit es -> Posit es
approx_atanh forall a b. (a -> b) -> a -> b
$ Posit es
x forall a. Fractional a => a -> a -> a
/ Posit es
2
in (Posit es
2 forall a. Num a => a -> a -> a
* Posit es
b) forall a. Fractional a => a -> a -> a
/ (Posit es
1 forall a. Num a => a -> a -> a
- Posit es
b)
hypot2 :: Posit es -> Posit es -> Posit es
hypot2 Posit es
a Posit es
b = let Posit (Next es)
a' :: Posit (Next es) = forall a b. Convertible a b => a -> b
convert Posit es
a
Posit (Next es)
b' :: Posit (Next es) = forall a b. Convertible a b => a -> b
convert Posit es
b
in forall a b. Convertible a b => a -> b
convert (forall (es :: ES). PositC es => Posit es -> Posit es
approx_sqrt forall a b. (a -> b) -> a -> b
$ Posit (Next es)
a'forall a b. (Num a, Integral b) => a -> b -> a
^Integer
2 forall a. Num a => a -> a -> a
+ Posit (Next es)
b'forall a b. (Num a, Integral b) => a -> b -> a
^Integer
2) :: Posit es
hypot3 :: Posit es -> Posit es -> Posit es -> Posit es
hypot3 Posit es
a Posit es
b Posit es
c = let Posit (Next es)
a' :: Posit (Next es) = forall a b. Convertible a b => a -> b
convert Posit es
a
Posit (Next es)
b' :: Posit (Next es) = forall a b. Convertible a b => a -> b
convert Posit es
b
Posit (Next es)
c' :: Posit (Next es) = forall a b. Convertible a b => a -> b
convert Posit es
c
in forall a b. Convertible a b => a -> b
convert (forall (es :: ES). PositC es => Posit es -> Posit es
approx_sqrt forall a b. (a -> b) -> a -> b
$ forall a. FusedOps a => a -> a -> a -> a
fsum3 (Posit (Next es)
a'forall a b. (Num a, Integral b) => a -> b -> a
^Integer
2) (Posit (Next es)
b'forall a b. (Num a, Integral b) => a -> b -> a
^Integer
2) (Posit (Next es)
c'forall a b. (Num a, Integral b) => a -> b -> a
^Integer
2)) :: Posit es
hypot4 :: Posit es -> Posit es -> Posit es -> Posit es -> Posit es
hypot4 Posit es
a Posit es
b Posit es
c Posit es
d = let Posit (Next es)
a' :: Posit (Next es) = forall a b. Convertible a b => a -> b
convert Posit es
a
Posit (Next es)
b' :: Posit (Next es) = forall a b. Convertible a b => a -> b
convert Posit es
b
Posit (Next es)
c' :: Posit (Next es) = forall a b. Convertible a b => a -> b
convert Posit es
c
Posit (Next es)
d' :: Posit (Next es) = forall a b. Convertible a b => a -> b
convert Posit es
d
in forall a b. Convertible a b => a -> b
convert (forall (es :: ES). PositC es => Posit es -> Posit es
approx_sqrt forall a b. (a -> b) -> a -> b
$ forall a. FusedOps a => a -> a -> a -> a -> a
fsum4 (Posit (Next es)
a'forall a b. (Num a, Integral b) => a -> b -> a
^Integer
2) (Posit (Next es)
b'forall a b. (Num a, Integral b) => a -> b -> a
^Integer
2) (Posit (Next es)
c'forall a b. (Num a, Integral b) => a -> b -> a
^Integer
2) (Posit (Next es)
d'forall a b. (Num a, Integral b) => a -> b -> a
^Integer
2)) :: Posit es
approx_gamma :: forall es. PositC es => Posit es -> Posit es
approx_gamma :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_gamma Posit es
z = forall (es :: ES). PositC es => Posit es -> Posit es
approx_sqrt(Posit es
2 forall a. Num a => a -> a -> a
* forall (es :: ES). PositC es => Posit es
approx_pi) forall a. Num a => a -> a -> a
* (Posit es
z forall (es :: ES). PositC es => Posit es -> Posit es -> Posit es
`approx_pow` (Posit es
z forall a. Num a => a -> a -> a
- Posit es
0.5)) forall a. Num a => a -> a -> a
* forall (es :: ES). PositC es => Posit es -> Posit es
approx_exp (forall a. Num a => a -> a
negate Posit es
z) forall a. Num a => a -> a -> a
* (Posit es
1 forall a. Num a => a -> a -> a
+ Posit es
series)
where
series :: Posit es
series :: Posit es
series = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(*) [forall a. Fractional a => Rational -> a
fromRational (Integer
a forall a. Integral a => a -> a -> Ratio a
% Integer
b) | (Integer
a,Integer
b) <- forall a b. [a] -> [b] -> [(a, b)]
zip [Integer]
a001163 [Integer]
a001164] [forall a. Fractional a => a -> a
recip forall a b. (a -> b) -> a -> b
$ Posit es
zforall a b. (Num a, Integral b) => a -> b -> a
^Int
n | Int
n <- [Int
1..Int
len]]
lenA :: Int
lenA = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Integer]
a001163
lenB :: Int
lenB = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Integer]
a001164
len :: Int
len = if Int
lenA forall a. Eq a => a -> a -> Bool
== Int
lenB
then Int
lenA
else forall a. HasCallStack => String -> a
error String
"Seiries Numerator and Denominator do not have the same length."
approx_sinc :: PositC es => Posit es -> Posit es
approx_sinc :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_sinc Posit es
NaR = forall (es :: ES). PositC es => Posit es
NaR
approx_sinc Posit es
0 = Posit es
1
approx_sinc Posit es
theta = forall (es :: ES). PositC es => Posit es -> Posit es
approx_sin Posit es
theta forall a. Fractional a => a -> a -> a
/ Posit es
theta
lnOf2 :: PositC es => Posit es
lnOf2 :: forall (es :: ES). PositC es => Posit es
lnOf2 = Posit es
0.6931471805599453094172321214581765680755001343602552541206800094933936219696947156058633269964186875420014810205706857336855202
a001163 :: [Integer]
a001163 :: [Integer]
a001163 = [Integer
1, Integer
1, -Integer
139, -Integer
571, Integer
163879, Integer
5246819, -Integer
534703531, -Integer
4483131259, Integer
432261921612371, Integer
6232523202521089, -Integer
25834629665134204969, -Integer
1579029138854919086429, Integer
746590869962651602203151, Integer
1511513601028097903631961, -Integer
8849272268392873147705987190261, -Integer
142801712490607530608130701097701]
a001164 :: [Integer]
a001164 :: [Integer]
a001164 = [Integer
12, Integer
288, Integer
51840, Integer
2488320, Integer
209018880, Integer
75246796800, Integer
902961561600, Integer
86684309913600, Integer
514904800886784000, Integer
86504006548979712000, Integer
13494625021640835072000, Integer
9716130015581401251840000, Integer
116593560186976815022080000, Integer
2798245444487443560529920000, Integer
299692087104605205332754432000000, Integer
57540880724084199423888850944000000]
twoMsqrt3 :: PositC es => Posit es
twoMsqrt3 :: forall (es :: ES). PositC es => Posit es
twoMsqrt3 = Posit es
0.2679491924311227064725536584941276330571947461896193719441930205480669830911999629188538132427514243243738585845932969700300549
sqrt3 :: PositC es => Posit es
sqrt3 :: forall (es :: ES). PositC es => Posit es
sqrt3 = Posit es
1.7320508075688772935274463415058723669428052538103806280558069794519330169088000370811461867572485756756261414154067030299699450
twoPi :: Rational
twoPi :: Rational
twoPi = Rational
6.2831853071795864769252867665590057683943387987502116419498891846156328125724179972560696506842341359642961730265646132941876892
fac :: Natural -> Natural
fac :: Natural -> Natural
fac Natural
0 = Natural
1
fac Natural
n = Natural
n forall a. Num a => a -> a -> a
* Natural -> Natural
fac (Natural
n forall a. Num a => a -> a -> a
- Natural
1)
approx_sqrt :: PositC es => Posit es -> Posit es
approx_sqrt :: forall (es :: ES). PositC es => Posit es -> Posit es
approx_sqrt Posit es
x = forall (es :: ES). PositC es => Posit es -> Posit es -> Posit es
approx_pow Posit es
x Posit es
0.5