如果我们将格式更改为类似于双IEEE 754-1985的格式,我们能消除数字的浮点错误吗



目前IIRC显示浮点数的方法是将其显示为1/2 + 1/4 + 1/8 ...。然而,如果我们改变我们对浮点数的方法,使任何浮点数实际上都是一个普通整数,后面加上一系列0,会怎么样。每个数字都必须更大,类似于62位的双精度。

对于62位的双精度,我们为指数保留了11位,为实际数字保留了53位。现在,我们可以做的是用一个数字来表示";零";在这个例子中,我们可以用11作为填充位,这意味着53位数字的精度为(2 ^ 11) - 1位。

假设我想显示0.4,目前在Python中,我们知道0.4有浮点问题,例如

>>> import decimal
>>> decimal.Decimal(0.4)
Decimal('0.40000000000000002220446049250313080847263336181640625')

然而,用我的编码,这不会发生,为什么?因为我可以用传统的二进制100来表示数字4,并且可以用二进制101来表示超过零的量。这意味着我可以用数字来表示数字0.4,而没有任何浮点问题

0 00000000001 00000000000000000000000000000000000000000000000000100

为符号保留的第一个比特,为零填充保留的下一个11,为数字保留的53。它需要更多的比特,但我现在可以准确地表示长度高达2 ^ 11位的数字。不仅如此,维基百科页面建议C++双精度只有16位,这意味着我的2048 - 16位更准确!

你特别提到IEEE 754-1985很奇怪,因为IEEE 754-2008已经引入了十进制算法。与double相比,你提出的方案的范围要小得多,这使得它不适合科学计算。事实上,十进制计算经常被保留用于财务计算,因为即使在日常生活中,我们也很少涉及绝对精度。我们可以在田里养3头牛,但它们的重量?他们的价格可能看起来绝对准确,但在你计算了你所欠的销售税之后?

IEEE 754-2008引入了小数64,其中最大有效数字仍然16。即使在科学领域(十进制算术不合适(,美国国家航空航天局的行星际飞行也依赖于小数点后第15位的3.141592653589793π。哦,但你想要财务计算吗?NET使用128位小数,精度为28-29位,世界各地的金融机构都很乐意采用.NET小数,而不必考虑其他花哨的方案。存在小数128,并且具有34位精度。

此外,您的方案不可能具有2048-16位的精度。你只为这个数字分配了53位,而.NET Decimal分配了96位,因为你的方案与非常相似

Decimal值的二进制表示由一个1位符号、一个96位整数和一个比例因子组成,该比例因子用于划分96位整数并指定其哪一部分是小数。比例因子隐含地是数字10,提升到0到28范围内的指数。

精度应该在decimal64的16位(使用50位(和.NET Decimal的28位之间的低端。在实践中,普通用户不会每天进行数十亿美元的财务计算,因此消费者的CPU不会费心采用IEEE 754-2008,而且由于只有人要求他们购买IBM的Power CPU来固定在服务器中,所以不要指望本地硬件和集成(如标准,而不是额外的库(语言支持很快就会出现

任意精度的软件库确实存在。使用它们的缺点是速度快。即便如此,你也永远无法表示具有无限个重复数字的数字。

您也可以使用积分类型定义自己的不动点编码。如前所述,您将以精度换取范围。

在Python中,我们知道0.4存在浮点问题

我不知道Python或任何其他语言存在0.4的问题。一切都是完美的定义和确定性。

相关内容

  • 没有找到相关文章

最新更新