找到Haskell Int精度

时间:2015-01-10 20:55:58

标签: function haskell precision

Haskell中的Int使用机器本机精度。我知道我可以使用maxBound和minBound查询边界。是否有类似的查询精度宽度的方法?

这样的东西
getPrecision :: Int -> Int

返回32或64.

3 个答案:

答案 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