目前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
,并且可以用二进制1
、01
来表示超过零的量。这意味着我可以用数字来表示数字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的问题。一切都是完美的定义和确定性。