0

假设我得到整数xy(满足x <= y一个数字,0因此它们尤其可以被二整除)。然后我知道他们的平均值avg = ((x+y) / 2)也是一个整数。我想找到这个中点四舍五入的分辨率100。换句话说,如果我的两个输入是 75200 和 75300,那么平均值是 75250 并四舍五入到最接近的值100(但不超过或等于更大的数字)强制答案为 75200。

如何在不首先将所有内容除以 100 并使用以下浮点运算的情况下实现此逻辑:

x + std::floor((y - x) * .5 * 100 + .5)*0.01

换句话说,我怎样才能在没有浮点值的情况下执行上述操作,但在分辨率下获得相同的行为100而不是0.01

4

2 回答 2

3

要计算你可以做的平均值

avg = (x + y) / 2

(顺便说一句,即使在小型微控制器上,整数加法和除以 2 也是非常便宜的操作。)

要将其四舍五入到最接近的 100 倍数(对应于您的浮点示例),您可以这样做

result = ((avg + 50) / 100) * 100

整数除法向下舍入到最接近的整数。通过将其更改500您可以始终向下舍入,而将其更改为99始终向上舍入。

编辑:请注意,这种舍入方法不适用于负数。由于整数除法向零舍入,因此在这种情况下,您需要减去50,减去99始终向下舍入并减去0以始终向上舍入。

于 2013-01-18T22:03:26.803 回答
2

您有问题的示例需要强条件:

  • x 和 y 之间的差值需要不大于 100
  • y % 100 必须为 0

因此,在大多数情况下,简单的四舍五入非常适合您:

avg100 = avg - (avg % 100) + 100

棘手的部分是在没有条件的情况下修复剩余的错误 - 如果您想避免条件或操作缓慢。

为此,最好的方法是使用乘法,并将表达式分成两部分:

avg100 = avg - (avg % 100)
avg100 += 100 * !!(y - avg100)

大多数情况下,y 大于 avg100。在这种情况下,!!运算符将返回 1。在极少数情况下,当它们相等时,它将返回 0,并且不会更改值。

(不知道编译器是否真的会为'!!'运算符生成无条件的代码,但我没有一个连击的想法,如果可能的话,我认为它会。如果没有,这段代码仍然简短易懂。)

此外,您可以使用以下表达式计算平均值:

avg = y - (y-x)/2

甚至将除法改为位移位进行优化。

这不需要两个数字都是偶数,只要是相同的奇偶校验。

于 2013-01-18T21:23:21.100 回答