Haskell中的Int使用机器本机精度。我知道我可以使用maxBound和minBound查询边界。是否有类似的查询精度宽度的方法?
像
这样的东西getPrecision :: Int -> Int
返回32或64.
答案 0 :(得分:4)
一种可能性是
import Data.Bits
getPrecision = popCount (maxBound :: Int) + 1
答案 1 :(得分:2)
对于最近的库(GHC 7.8或更高版本附带的库),最简洁的方法是使用finiteBitSize
中的Data.Bits
。这正是您要求的功能。对于早期版本,您可以使用bitSize
,同样来自Data.Bits
,也可以使用相同内容的非完整版本。具体来说,bitSize
如果给出Integer
之类没有位大小的内容,则会抛出异常。 finiteBitSize
位于FiniteBits
子类中,因此将其应用于Integer
会产生类型错误。在最近的图书馆中也有bitSizeMaybe
,但这似乎没什么用处。
答案 2 :(得分:1)
您可以使用sizeOf
,但这需要注意,该类型不能包含任何填充位。
import Foreign (Storable, sizeOf)
getPrecision :: Storable a => a -> Int
getPrecision dummy = sizeOf dummy * 8