关于浮点:双打为什么会这样做

Why do doubles work how they do

我知道这可能是一个常见的问题,但我从来没有找到答案(也许这与不知道如何正确搜索谷歌有关,所以如果有人能指出我的参考资料,我会删除这个问题)。

为什么double的工作方式是用2的逆幂表示小数的右边,用2的幂表示小数的左边?我知道它可以表示非常大的数字,但是还有其他的优势吗?.NET框架有可用的decimal数据结构,使用它似乎更合乎逻辑,因为它是我们用人类符号表示数字的方式。

实际上,我的问题是,为什么创建双精度数的方式,而不是最初创建像小数这样的东西(这似乎不太常见)。


你的困惑似乎没有根据。小数点的右边总是用基数的逆幂表示,左边总是用基数的幂表示。这同样适用于基数10和基数2。二进制浮点数存储一个指数,该指数控制小数点在尾数上的位置。

至于它们存在的原因:二进制浮点符号有两个方便的特性:

  • 它比较快,因为它使用二进制算法
  • 它能以一定的精度表示非常大或非常小的数字。
  • 这些属性使它们非常适合物理计算,因为最后一处的小错误并不重要,但会使它们无法用于货币应用程序(在需要decimal的地方,尽管计算速度要慢得多)。


    fp格式将最大精度打包为一个"word"或两个"word"对象,同时添加一个指数,以便科学计算1。涉及大值或小值时,可采用等精度进行。因为对象适合字,所以它们可以放入寄存器,并且它们在CPU硬件和GPU单元中得到支持,所以它们确实非常快。

    十进制格式更慢、更大,它们几乎不受硬件支持,但它们也不需要复杂的二次计算,所以这无关紧要。我们可以很容易地计算软件中的bean。十进制字符串的一个优点是,我们在现实生活中写的数字(0.10,0.11,0.12,…)可以精确表示,这对会计有真正的帮助。(奇怪的是,由于我们使用了基数10 IRL,我们在商业中写的几乎所有数字如果有分数,实际上都不能用基数2表示。)

    任何一种格式都可以用于具有足够的kludges和精心编程的相反应用程序,但没有太多意义。

    1。结果表明,即使精度是有限的,也没有物理常数,甚至接近双数据类型的精度。所以,它们确实是这些计算类型所需要的。这些天简直难以置信。如果你能在几年内把它收回,每一个GPU都将成为世界上最快的超级计算机CPU。