为什么我们说Double类型是真正的浮点数,是Float类型的精度的两倍

时间:2018-07-15 04:09:17

标签: floating-point double precision

circumference :: Float -> Float  
circumference r = 2 * pi * r  

ghci> circumference 4.0  
25.132742 


circumference' :: Double -> Double  
circumference' r = 2 * pi * r 

ghci> circumference' 4.0  
25.132741228718345 

我在Haskell中对此进行了测试。

此处Float类型的精度为6位数字。 Double类型的精度为15位数字。 Double类型的精度显然是Float类型的两倍以上。说Double类型是真正的浮点数还是Float类型的精度的两倍还正确吗?

1 个答案:

答案 0 :(得分:4)

正如卡尔在评论中说的那样,它更多的是一个IEEE-754问题,而不是一个Haskell问题。

该标准使精度和尾数位有所不同。精度是用于对数字进行编码的位数。

每个IEEE-754数字由三个元素组成:一个符号,一个指数和一个尾数。

如果符号始终为1位,则将精度加倍或翻倍时,尾数和指数位将不按比例进行位计数:

  • 对于单精度(32位),有8个指数位的23个尾数位。
  • 对于双精度(64位),11个(非16个)指数位有52个(非46)尾数位。

您还应该注意,您正在比较十进制表示的精度。 IEEE-754数字从根本上讲是二进制数字(存在十进制数字,但这是另一回事了):

  • 1.25 [10)= 1.01 [2]
  • 1.2 [10] = 1.00110011001100110011001100110011 ... [2]

进一步: