查找 Haskell 整数精度
Find Haskell Int precision
Haskell 中的 Int 使用机器的本机精度。我知道我可以使用 maxBound 和 minBound 查询边界。有没有类似查询精度宽度的方法?
类似
getPrecision :: Int -> Int
其中 returns 说 32 或 64。
一种可能是
import Data.Bits
getPrecision = popCount (maxBound :: Int) + 1
您可以使用 sizeOf
但这需要注意类型不能有任何填充位。
import Foreign (Storable, sizeOf)
getPrecision :: Storable a => a -> Int
getPrecision dummy = sizeOf dummy * 8
对于最近的库(GHC 7.8 或更高版本附带的库),最干净的方法是使用 Data.Bits
中的 finiteBitSize
。这正是您要求的功能。对于早期版本,您可以使用 bitSize
,也来自 Data.Bits
,同一事物的非完整版本。具体来说,如果 bitSize
被赋予 Integer
之类的没有位大小的内容,则会抛出异常。 finiteBitSize
属于 FiniteBits
子类,因此将其应用于 Integer
会出现类型错误。最近的库中也有一个 bitSizeMaybe
,但它似乎不太有用。
Haskell 中的 Int 使用机器的本机精度。我知道我可以使用 maxBound 和 minBound 查询边界。有没有类似查询精度宽度的方法?
类似
getPrecision :: Int -> Int
其中 returns 说 32 或 64。
一种可能是
import Data.Bits
getPrecision = popCount (maxBound :: Int) + 1
您可以使用 sizeOf
但这需要注意类型不能有任何填充位。
import Foreign (Storable, sizeOf)
getPrecision :: Storable a => a -> Int
getPrecision dummy = sizeOf dummy * 8
对于最近的库(GHC 7.8 或更高版本附带的库),最干净的方法是使用 Data.Bits
中的 finiteBitSize
。这正是您要求的功能。对于早期版本,您可以使用 bitSize
,也来自 Data.Bits
,同一事物的非完整版本。具体来说,如果 bitSize
被赋予 Integer
之类的没有位大小的内容,则会抛出异常。 finiteBitSize
属于 FiniteBits
子类,因此将其应用于 Integer
会出现类型错误。最近的库中也有一个 bitSizeMaybe
,但它似乎不太有用。