Bootstrap

计算机的错误计算(三十四)

摘要  用错数预测 a^x(或 pow(a,x))函数的结果中含有的错误数字的个数,并与Visual Studio 和Excel 的输出中含有的错误位数相比较。结果显示,预测与实际一致。

       对于 a^x(或 pow(a,x))函数,根据 a与 x的不同,有多种计算算法。其中一种计算方法是利用等价公式 e^{x\ln(a)} 来计算。

例1.  假设计算机利用 e^{-99.88\times\ln(90)} 计算 90^{-99.88} ,请预测计算机的输出中可能存在的错误数字个数。

       计算机首先计算 (-99.88)\times\ln(90) 的值,然后计算 e^{(-99.88)\times\ln(90)}

       根据计算机的错误计算(二十七)知,前者即自变量的错误数字个数会影响到后者即函数值的结果的错误数字个数。具体有关系:j-k\approx m+m_1-m_2\,.  其中 等号左边的 2个变量依次表示函数值与自变量的错误数字个数,右边 3个变量依次代表导数、自变量以及函数值的扩展整数位数(扩展的意思是可以为任意整数)。

       对于函数 e^x 来说,其导函数不变,因此,m=m_2\,.  这时,上式变成了 j-k\approx m_1\,, 即 j\approx k+m_1\,.  它意味着函数值的结果的错误数字个数约等于自变量的错误数字个数与自变量的整数位数的和。

       下面给出计算机计算自变量 (-99.88)\times\ln(90) 值的过程,以便获得上述两个值 k 与 m_1\,.

(-99.88)_{10}\times\ln((90)_{10})\\ \approx (-\underbrace{1100011.1110000101000111101011100001010001111010111000}_{\textup{53 bits}})_2\\\times\ln((1011010)_2)\\ =(-99.8799999999999954525264911353588104248046875)_{10}\\\times\ln((90)_{10})\\ =(-99.8799999999999954525264911353588104248046875)_{10}\\\times(4.499809670330265066808481928529415616896...)_{10}\\\approx (-99.8799999999999954525264911353588104248046875)_{10}\\\times(\underbrace{100.01111111111100111000011011001100010010110000010000}_{\textup{53 bits}})_{2}\\= (-99.8799999999999954525264911353588104248046875)_{10}\\\times(4.4998096703302650212208391167223453521728515625)_{10}\\= (-449.4409898725868498567721402184132729378729...875)_{10}\\\approx (-111000001.01110000111001001011011001011000101000001011)_2\\= (-\underbrace{\textcolor{blue}{449.440989872586}\textcolor{red}{\,8}}_{\textup{16 digits}}4019252541474997997283935546875)_{10}\,.

这样,上述蓝色与红色数字的组合为双精度下 16位的结果;而其整数位数为 3位,即 m_1=3\,.

       另外,由 ISReal 软件 可得 16位的正确结果是 -\textcolor{blue}{449.440989872586}\textcolor{red}{\,9}\,.  通过比较上述计算值与真实值,容易看出只有两个红色数字不同,因此 k=1。于是,若利用 e^{(-99.88)\times\ln(90)} 计算 90^{-99.88},则计算机的输出中会有约 j\approx k+m_1=1+3=4 位错误数字。 

例2.  在 Windows 10下,利用 Excel 2019MSO 以及 Visual Studio 2010 计算 90^{-99.88} 的值。

       首先, 由 ISReal 软件 知,16位正确的近似值为 6.46038138673\textcolor{red}{\,4883}\textup{\,e}-196\,.

     (1)在 Excel 的单元格中分别输入:

=\textup{EXP}(-99.88*\textup{LN}(90))\\ =\textup{POWER}(90,-99.88)

则输出的结果完全相同,并均有 4位错误数字。

       下面是它们的贴图:

上面是第1张图.

上面是第2张图.

     (2)在 Visual Studio 2010中运行下列两条语句

 printf("\%.15e",exp(-99.88*log((double)90)));\\ printf("\%.15e",pow((double)90,(double)-99.88));

则输出分别为 6.460381386735107e-196 与 6.460381386735015e-196.

       于是,两个结果同样均有 4位错误数字。 

;