Function 查找Haskell整数精度

Function 查找Haskell整数精度,function,haskell,precision,Function,Haskell,Precision,Haskell中的Int使用机器的本机精度。我知道我可以使用maxBound和minBound查询边界。是否有类似的查询精度宽度的方法 差不多 getPrecision :: Int -> Int 返回值为32或64 一种可能性是 import Data.Bits getPrecision = popCount (maxBound :: Int) + 1 您可以使用,但这附带了一条警告,即类型不能有任何填充位 import Foreign (Storable, sizeOf) ge

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

差不多

getPrecision :: Int -> Int
返回值为32或64

一种可能性是

import Data.Bits

getPrecision = popCount (maxBound :: Int) + 1
您可以使用,但这附带了一条警告,即类型不能有任何填充位

import Foreign (Storable, sizeOf)

getPrecision :: Storable a => a -> Int
getPrecision dummy = sizeOf dummy * 8

对于最新的库(GHC 7.8或更高版本附带的库),最干净的方法是使用
Data.Bits
中的
finiteBitSize
。这正是您要求的功能。对于早期版本,您可以使用
位大小
,也可以使用
数据。位
,这是同一事物的非总版本。具体地说,
bitSize
将抛出一个异常,如果它被赋予了类似于
Integer
的没有比特大小的东西
finiteBitSize
位于
FiniteBits
子类中,因此将其应用于
整数将产生类型错误。在最近的库中也有一个
bitSizeMaybe
,但它通常不太有用。

尝试使用并乘以8?谢谢,正如我所怀疑的那样非常简单。您想得到答案吗?还要注意,Haskell只指定
Int
s必须至少为29位。GHC是最常见的编译器,它使用机器本机精度。@OllieB然后使用
Data.Word
Data.Int
中的固定宽度整数(例如:Word32、Int16等)。不要让代码为一个体系结构(例如:32位)而不是其他体系结构工作!是的,但这可能不是问题机器的最佳选择。这是一个很好的解决方案。我会看看还有什么弹出窗口,因为我已经看到了两种到目前为止我还没有想到的方法。如果你只是要求Int的大小,那么bitSize应该可以。@PaulJohnson,是的,但我相信它已经被弃用了,所以我不会特别推荐它。