当前位置: 首页 > 知识库问答 >
问题:

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

吕皓
2023-03-14
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中进行了测试。

这里浮点类型的精度是6位。而双精度类型的精度是15位。双精度类型的精度显然是浮点类型的两倍多。说双精度类型是浮点类型精度的两倍还正确吗?

共有1个答案

单于智
2023-03-14

正如卡尔在评论中所说,这更像是一个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.001100110011。。。[2]

更进一步:

  • 维基百科页面:https://en.wikipedia.org/wiki/IEEE_754
  • IEEE-754浮点转换:https://babbage.cs.qc.cuny.edu/IEEE-754.old/Decimal.html
 类似资料:
  • 2.2.3 浮点数类型 float 浮点数就是包含小数点的数,大体对应于数学中的实数集合。现实世界中的职工工资(以 元为单位)、房屋面积(以平方米为单位)、人的身高(以米为单位)、圆周率等在程序中都 适合用浮点数表示。 Python 语言提供了类型 float 用于表示浮点数。float 类型的字面值形式与数学中的 写法基本一致,但是允许小数点后面没有任何数字(表示小数部分为 0),例如下列字面值

  • 问题内容: 我很好奇为什么必须这样声明float文字: 代替 为什么默认类型是双精度类型,为什么编译器不能通过查看赋值的左侧来推断它是浮点型的?Google仅提供关于默认值的解释,而不是为什么如此。 问题答案: 为什么默认类型是双精度型? Java语言的设计者最好问这个问题。他们是唯一知道做出语言设计决定的 真正 原因的人。但我希望推理遵循以下几条原则: 他们需要区分两种类型的文字,因为从数学的角

  • 为什么浮点数据类型的精度不与其大小成正比增长?例如: 正如您所看到的,的精度大约是精度的两倍,这是有意义的,因为的大小是。 但这与双精度和长双精度的情况不同,长双精度的大小是128位,是64位双精度的两倍,但其精度只多出三位!! 我不知道浮点数是如何实现的,但从理性的角度来看,仅为三位精度使用64位内存是否有意义?! 我四处搜索,但没有找到一个简单明了的答案。如果有人能解释为什么长双精度只比双精度

  • 在阅读了这个问题和这个msdn博客之后,我尝试了几个例子来测试这个: 是的,预期输出为假。因此,我尝试将表达式的两侧强制转换为double和float,以查看是否可以得到不同的结果: 第一行输出但第二行输出,为什么会发生这种情况? 此外 即使没有铸造,上面的两行都给出了。和... 这一行输出。如果它们都被浮点数减去,如何从减去18.01中减去8的差异? 我试图通读博客并提出问题,但似乎在其他地方找

  • Monoid函数的类型签名是:

  • 问题内容: 访问主窗口时,它将作为 为什么它返回为double可选,这是什么意思?如果放入a中,我应该在其后添加一个? 尽管我的第一个建议是替换为after委托,但这不是解决方案。 问题答案: @matt有详细信息,但是有一个(有点可怕,有点很棒)的解决方法。(不过请参见下面的编辑) 我会将对这一行代码的理解留给读者作为练习。 好吧,我撒谎,让我们分解一下。 好的,到目前为止很好。在这一点上,我们