БлогNot. Посчитать арифметическое среднее без переполнения?

Посчитать арифметическое среднее без переполнения?

Так как это не просто трюк, а может быть полезно, например, в таких вот случаях, кину отдельной заметкой.

Попытаемся посчитать арифметическое среднее от двух больших числовых значений, например, равных INT_MAX, обычным способом:

#include <iostream>
using namespace std;

int average(int a, int b) {
 return (a + b) / 2;
}

int main() {
    int a = INT_MAX, b = INT_MAX;
    cout << "a = b = : " << INT_MAX << endl;
    cout << "Average = " << average(a, b);

    cin.get(); return 0;
}

Мой QT на это выдал:

a = b = : 2147483647
Average = -1

А теперь примением в функции average "улучшенную формулу":

return  a/2 + b/2 + (a%2 + b%2)/ 2;

Результат равен 2147483647, то есть, корректен. Подумайте, для всех ли значений будет так и почему :)

18.03.2018, 10:07 [2318 просмотров]


теги: c++ числа алгоритм

К этой статье пока нет комментариев, Ваш будет первым