整数运算。 将结果四舍五入。 第一部分

乍一看,任务越简单,开发人员对如何正确实施该任务的思考就越少,而所犯的错误充其量只能发现到很晚,最糟糕的是,它根本不会被发现。 这将是这些任务之一,即仅支持整数算术的控制器中的分数除法和缩放。

为什么应用程序程序员在这样的算术条件下不注意计算的复杂性,这是一个问题。 我只想建议,在所有可能的情况下,在计算器上进行计算的习惯正在影响……在任何情况下,以令人羡慕的规律性,“我有幸福”都注视着商店中的同事如何踩同样的耙子。 该材料旨在消除相同的“耙子”。

在整数算术中,一个整数除以另一个的结果由两个数字组成:商和余数。 如果我们丢弃除法的其余部分,我们将得到的结果以绝对值取整,以较小的整数为单位。

用分数实现计算时,这一时刻常常被忽略,而错过了,它们会损失计算的准确性。 此外,计算精度随着分频器值的增加而降低。 例如,那个53/13那个那个64/13会得到4,尽管实际上,第二个分数的除法商更接近于5。
实际上,将结果四舍五入到最接近的整数很容易组织。 为此,只需将除法的余数加倍,将其与自身求和,然后再将其除以与最初除法相同的数字,然后将此除法的商加到从初始除法运算获得的商中即可。
在第一个简单示例中,我将使用计算两个量的比率的示例演示如何在软件中实现这种舍入

Y=k=A/B


考虑到程序中可能需要反复进行这样的计算,因此我们以适合打包到子程序中的格式来实现计算算法。

为了正确执行为此所需的中间计算,将需要五个寄存器的数组。 为什么是五个而不是更少,我将解释得更低一些。

动作算法:

1. TEMP[2]= A 2. TEMP[3]= B ----- 3. TEMP[0,1]= TEMP[2]/TEMP[3] 4. TEMP[1,2]= TEMP[1]*2 5. TEMP[4]= 0 6. TEMP[1..4]= TEMP[1,2]/TEMP[3,4] 7. TEMP[0]= TEMP[0]+TEMP[1] ----- 8. Y= TEMP[0] 

步骤3至7可以移至子例程。

如果需要,可以通过将计算子例程外部的TEMP [0]与TEMP [1]相加来直接记录结果。 这是无原则的。 唯一要记住的是,对于许多相同类型的计算,删除程序主体的加法运算会导致程序使用的程序存储器增加。

那么为什么要花多达5个寄存器来进行中间计算呢? 如前所述,将除数的余数本身求和的操作被乘以二的余数来代替吗? 非常简单-为了使用无限的整数集进行运算。

让我解释一下:例如,如果将32767除以-32768,则得到32767,其相加结果无疑会超出整数范围。
即,为了四舍五入这种分数的结果,分数的整数除法的两倍余数应始终以双整数格式表示。
待续...

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


All Articles