Floating point 如果我们将格式更改为双IEEE 754-1985的类似格式,是否可以删除数字的浮点错误?

Floating point 如果我们将格式更改为双IEEE 754-1985的类似格式,是否可以删除数字的浮点错误?,floating-point,precision,floating-accuracy,Floating Point,Precision,Floating Accuracy,目前IIRC显示浮点数的方法是将浮点数显示为1/2+1/4+1/8。。。。但是,如果我们改变了对浮点数的处理方法,使得任何浮点数实际上都是一个普通整数,由一系列0填充回来,会怎么样呢。每个数字都必须更大,类似于62位双精度 对于62位双精度计数器,我们为指数保留了11位,为实际数字保留了53位。现在,我们可以做的是让一个数字代表我们用它填充的零的数量。在本例中,我们可以使用11作为填充位,这意味着53位数字的精度为2^11-1位 假设我想显示0.4,目前在Python中我们知道0.4有浮点问题,

目前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,而不存在任何浮点问题

0000000000 1 00000000000000000000000000000000000000000000 100


第一位为符号保留,第二位为零填充,第53位为数字。它需要更多的位,但我现在可以精确地表示长度为2^11位的数字。不仅如此,维基百科页面建议C++双精度只有16位,这意味着我的2048到16位数更精确!p> 奇怪的是,你特别提到IEEE 754-1985,因为它已经引入了十进制算法。与double相比,您提出的方案的范围小得多,因此不适合进行科学计算。事实上,十进位计算经常被保留用于财务计算,因为即使在日常生活中,我们也很少涉及绝对精度。我们可以在田里养3头牛,但是它们的体重呢?他们的价格似乎绝对准确,但在你计算了你所欠的销售税之后

IEEE 754-2008引入,其中最大有效数字仍然为16。即使在科学领域,十进制算法是不合适的,NASA的行星际望远镜也依赖于不起眼的3.141592653589793的π,在小数点后15位。哦,但是你想要财务计算?NET使用128位小数,它给出了数字精度,世界各地的金融机构都乐于采用.NET小数,而不必担心其他花哨的方案。存在并具有34位精度

此外,您的方案不可能具有2048-16位精度。当分配.NET Decimal时,您只为数字分配53位,因为您的方案非常相似

十进制值的二进制表示法由1位符号、96位整数和用于除以96位整数并指定其中哪部分是小数的比例因子组成。比例因子隐式为数字10,其指数范围为0到28


精度应该在小数64的16位(使用50位)和.NET十进制的28位之间的低端。在实践中,普通用户每天不会进行数十亿次的财务计算,因此消费者的CPU不必费心采用IEEE 754-2008,而且由于唯一要求他们购买IBM Power CPU的人都购买了IBM的Power CPU来安装在他们的服务器中,所以不要期望本机硬件和标准中的集成,任何时候都不会有额外的库语言支持

存在任意精度的软件库。使用它们的缺点是速度。即使这样,您也永远无法表示具有无限个重复数字的数字

您还可以使用整数类型定义自己的定点编码。如前所述,您将以精度换取范围

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


我不知道Python或任何其他语言在0.4中存在问题。每件事都有很好的定义和确定性。

现在试着取一个平方根,甚至只除以3。十进制不是魔法。它只是十进制。我现在可以准确地表示长度不超过2^11位的数字。Re“显示浮点数的方法”:数字由浮点数格式表示,而不是显示。Re“普通整数,由一系列0填充”:指数缩放数字;它不会填充它。而且各种浮点格式可能已经被解释为按指数缩放的整数,因此不清楚您建议的更改。也许你的意思是用10的幂来代替2的幂。现在已经有了这种基于十进制的格式。它们不能消除错误。Re“62位双精度”:64位用于双精度。