jos*_*p91 10 floating-point haskell fractions
Haskell Floating和Fractional类之间有什么区别?
可以在Prelude的文档中找到Fractional和定义:Floating
Run Code Online (Sandbox Code Playgroud)class Num a => Fractional a where (/) :: a -> a -> a recip :: a -> a fromRational :: Rational -> a分数,支持真正的分裂.
[...]
Run Code Online (Sandbox Code Playgroud)class Fractional a => Floating a where pi :: a exp :: a -> a log :: a -> a sqrt :: a -> a (**) :: a -> a -> a logBase :: a -> a -> a sin :: a -> a cos :: a -> a tan :: a -> a asin :: a -> a acos :: a -> a atan :: a -> a sinh :: a -> a cosh :: a -> a tanh :: a -> a asinh :: a -> a acosh :: a -> a atanh :: a -> a三角函数和双曲函数及相关函数.
[...]
所以要把它翻译成英文:A Fractional是我可以定义一个部门的任何类型的数字:
(/) :: Fractional a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)
例如,浮点数可以是这种情况,但也可以是分数(其中分数具有分子和分母).这不是的情况下Int,因为如果将一个Int由Int并不总是产生一个Int(在计算机上以及技术上浮点除法是不完全一样,但这是另一回事).
Fractional数字子集Floating是定义三角函数的数字.例如,sin分数的总是不可能产生分数:a sin被定义为无限序列的和.仅适用于数量非常有限的情况(例如sin 0).基本上,定义三角函数的计算机上的唯一数字(近似)是浮点数.
非常粗略:
Fractional是可以表示任何有理数的(确切地或至少在适当的近似中)的类型类.它也可能能够代表其他数字,但这并不重要.
换句话说,它只是具有除法运算的数字类型; 因为它是它的子类,Num因此类型必须包含有理数.
Floating是Cauchy意义上的限制范围内的数字类型,即完整空间.这对任何一种微积分都是必要的.Floating该类的方法是在数学上定义为极限的函数,即无限和(这是泰勒序列的部分和的序列的极限).
由于您可以将实数定义为有理数序列的限制,并且因为它又Floating是子类Fractional,所以任何Floating类型都能够表示(再次,至少是一个不错的近似值)任何实数.
可视化差异的一种好方法是通过拓扑:Floating类型是连接空间,即它们形成连续体.这对浮点数的意义是:每个值都被理解为实数的整个区间(因为浮点总是有一些不确定性).当您并排放置这些间隔时,可以无间隙地平铺整个实数(至少为±10 300).
相比之下,某些Fractional类型没有连接.特别是,它Rational可以精确地表示其所有(有理数)值,因此每个值只是一个"无限小点".你永远不能用这些点覆盖整个实线,并且你不能计算像这样的函数sin或log因为这些函数的结果通常是非理性实数.
值得深思的是这个"体面的近似"意味着什么.Haskell标准没有定义这个.关于代表整个实数区间的每个浮点数的这个故事很好地捕捉了IMO.更一般地说,我们可能会说:Num/ Fractional/ Floating是表示整数/有理数/实数的等价类的类型类.实际上,这些类甚至不需要是"小"区间:特别是类似Word32或标准的有限类型Int可以用模块化算术意义理解,在结果中表现出来(2^70 :: Int) == 0,即等价类是数字空格乘以2的倍数64.
在类似Integeror的情况下Rational,等价类实际上只包含一个元素,即数字是精确表示的.对于实数,这实际上也是可能的,但更棘手的是,它被称为精确的实数算术.像aern这样的图书馆可以做到这一点.
| 归档时间: |
|
| 查看次数: |
3654 次 |
| 最近记录: |