十进制算术的二进制计算

从以前的文章[1,2,3,4]开始,继续使用二进制算法研究十进制精度问题,我能够开发出计算以十进制浮点数形式表示的实数的算法,其给出的精确结果与计算将手动完成。

这些算法使用由IEEE754标准规定的二进制算法。 为了测试算法的操作,开发了一个C ++测试程序,该程序实现了18位十进制计算器。
由于材料的数量超出了帖子的格式,因此我以摘要的形式列出了要点。 我们称这个职位为May Thes :(。

这样啊

众所周知


用户熟悉的算术是十进制算术。

还有b-ary算术,其中b是数字系统的基数,采用任何非零值[5]。

为了显示不同比例的数字,我们使用浮点数表示法,其形式为尾数和任意基数的乘积。 这就是所谓的指数表示法。

如果数字的度数是固定的,并且数字的尾数是整数,则此格式称为定点格式。 定点格式的特殊情况是次数为零的数字。 此格式是整数格式。

如果尾数是b进制数系统中的一个小数,且整数部分c≠0并且c <b,则将该数字称为归一化。

尽管事实是,数字由于其物理性质而为近似值,但对于计算设备而言,它们是准确的数字,并且该设备必须以用户指定的精度对其执行操作。

算术中的精确计算意味着获得在点[6]之后具有给定数量的有效有效数字的结果。

计算机中的所有计算均以二进制形式执行。 对于他们来说,底数是b = 2。

由于二进制和十进制数系统是无法比拟的,因此在将十进制实数转换为二进制代码时,大多数情况下,我们会得到十进制数的二进制当量的近似值。 因此,将十进制数转换为二进制时,会出现表示错误。

具有完全等效的十进制数的十进制数称为可表示的。
没有确切的二进制等效项的十进制数称为无代表性。

如果二进制整数中的有效数字位数不超过写入它们的机器字区域的位网格,则所有整数十进制数字都是可表示的。

代表该数字的二进制等价位数越多的二进制数字,则表示误差越小。 这解释了不断增加处理器操作寄存器容量的愿望。

十进制数的等效二进制数包含的有效位数超过了机器字的位网格,则只能近似表示。

算术运算的结果超出机器字尾数的位深度,将返回一个近似数字。

近似数字可能包含真实,可疑和错误的数字。
计算中不正确的数字会影响准确性,有时会导致完全错误的结果[3]。

根据近似计算的理论,为了获得正确的结果,对近似数进行四舍五入以排除不正确的数[6]。

用户想要或可以在计算中获得的准确度由计算算法提供的有效数字的数量确定。

任何二进制数都可以四舍五入为指定的二进制数,从而舍弃多余的位。

同样,任何十进制数字都可以四舍五入为所需的十进制数字,从而舍去多余的数字。

您不能简单地舍弃二进制数中多余的二进制数以将其十进制等效数舍入为给定数量的十进制数字,因为减小十进制数的等效二进制数的位深度会增加其十进制等效数的无效位数。

任何以十进制小数形式表示的实数都可以精确地以浮点数(TFT)的格式表示,其中尾数是整数。 NTC的参展商将在该编号中指示该点的位置。

如果数字以带有整数尾数的NTC格式表示,则该数字的尾数和指数可以准确地转换为二进制代码。

新品


十进制TNT尾数由十进制整数尾数的二进制等效项表示,而指数为10的幂的二进制等效项(基数b = 10)的格式将称为混合十进制二进制格式(SDDF)。

SDDF与二进制TFT格式之间的区别在于SDDF中的指数等于基本度b = 10,而二进制TFT格式的指数等于二进制基本度b = 2。 因此,对于SDDF,数字将显示为 F=M210e对于CNC,在IEEE754标准中, F=M22e

SDDF和二进制十进制(DDF或BCD)TFT格式之间的区别在于,在DDF中,尾数和指数是整数十进制数字,其中每个数字都写为字节或四进制,而所有十进制数字均以SDDF表示它们的整数二进制等效项。

因此,可以用不超过N个有效十进制数字的二进制代码在SDDF中表示任何十进制实数。

SDDF中对十进制CTD的所有算术运算都是根据普通算术规则执行的,其中所有参数均为整数。

在每次算术运算之前,十进制数字都以SDDF格式表示:[S,M,z,e]。 数字符号(0或1)的S代码在哪里。 M是数的尾数与小数位数N的二进制整数等效形式。其中N是计算的精度。 z是指数的符号,e是指数的值。 这样的表示是归一化的十进制表示。

例如,对于精确到N = 7个有效数字的计算,数字123,456应该表示为1234560 * 10 ^ -4。

N = 7的最小十进制尾数将为M = 1,000,000。

N = 7的最大十进制尾数为M = 9999999。

最大7位数字9999999的二进制等效项将是100110001001001011001111111。它包含24个二进制数字。 因此,需要一个二进制的24位寄存器来表示从1,000,000到9999999的十进制尾数。

如果在32位二进制机器字中,其中24个数字分配给尾数,一个数字分配给数字S的符号,一个数字分配给指数z,6个数字分配给指数,则可以在这样的SDF中表示十进制实数精确到N = 7个有效十进制数字。 这些数字的绝对值范围为1,000,000 * 10 ^ -64到9999999 * 10 ^ 64。

每次算术运算后,数字的十进制尾数应标准化并四舍五入为最接近的整数。 为此,如有必要,应将所得结果的数字尾数的二进制当量乘以或除以10的二进制当量,以使尾数的十进制当量的位数变为等于N.结果数应四舍五入为最接近的整数。

一个例子。

查找直到N = 7的表达式结果(9675,423 * 10 ^ 2-9,675421 * 10 ^ 5)* 10 ^ 6-199992
手动计算,或在Windows计算器上,此表达式将等于数字8.000000
我们以标准化形式编写操作数:

A=9,675423*10^5= 9675423*10^-1
B= 9675,421*10^2 = 9675421*10^-1
C=1000000 = 1000000*10^0
D = 1999920*10^-1


在SDDF中,这些操作数将表示为:

A=[0, 9675423,1, 1]
B=[0,9675421,1, 1]
C=[0, 1000000,0, 0]
D=[0, 1999920,1, 1]


求出差S = AB。 由于操作数A和B的指数相同,因此我们发现它们的尾数不同:

9675423-9675421=2

要对尾数S进行归一化,我们必须将其乘以10 ^ 6,而指数必须减少6。然后S = 2 * 1,000,000 = 2,000,000 * 10 ^ -7

我们计算乘积P = D *C。 为此,将因子的尾数相乘并添加指数:

M = 2,000,000 * 10 ^ -7 * 1,000,000 * 10 * 0 = 2,000,000,000,000 * 10 ^ -7
尾数归一化后,我们得到P = 2,000,000 * 10 ^ -1。
计算结果R将等于:
R = PD = 2,000,000 * 10 ^ -1-1999920 * 10 ^ -1 = 80 * 10 ^ -1
归一化后,我们得到R = 8000000 * 10 ^ -6。

为了进行比较,在Excel中计算此表达式将得出结果R = 8,0000698E + 00。

作者在SDDF中开发了一种计算器算法,该算法可以执行最多18个有效数字的十进制数的加,减,乘和除。 为了确认算法的正确性,编写了一个C ++程序。 由于作者不是专业程序员,因此开发的程序仅用于计算算法的研究。

下面是一个示例,该屏幕截图演示了以下表达式的计算:

1,23456789098765432*10^8 * 9,87654321234567891*10^(-9) - 1,2193263123914037*10^0≈ 3.0*10^(-17)



为了测试性能,一个周期内将两个18位数字相乘。 该程序在Intel®Core(i)i3-4330 CPU@3.50GHz 3.50 GHz计算机上运行。 内存8.0 GB。 系统类型:64位 速度等于每秒≈2.4 * 10 ^ 6次乘法。

到目前为止,我无法与Windows和Excel计算器的速度进行比较,这里没有足够的知识:(。至于计算的准确性,就如同手动进行计算一样。

参考文献:

  1. 侧视图:IEEE754标准
  2. 浮点归一化是否必要?
  3. 使用浮点数时出现致命的二进制算术错误
  4. 关于浮点数
  5. 编号系统
  6. 近似计算的基本规则

Source: https://habr.com/ru/post/zh-CN412681/


All Articles