0 / 0 / 0
Регистрация: 30.03.2011
Сообщений: 41
|
|
1 | |
Нахождение среднего арифметического без переполнения20.04.2012, 16:43. Показов 10815. Ответов 19
Метки нет (Все метки)
Задача найти среднее арифметическое целых чисел (int).
Если просто складывать их и потом делить на количество происходит переполнение... может кто подскажет алгоритм как это осуществить без переполнения а то я никак допереть не могу...
0
|
20.04.2012, 16:43 | |
Ответы с готовыми решениями:
19
Нахождение среднего арифметического без учета максимального элемента Нахождение среднего арифметического Нахождение среднего арифметического Нахождение среднего арифметического |
10 / 10 / 3
Регистрация: 19.04.2012
Сообщений: 20
|
|
20.04.2012, 16:44 | 2 |
0
|
0 / 0 / 0
Регистрация: 30.03.2011
Сообщений: 41
|
|
20.04.2012, 16:51 [ТС] | 3 |
Есть массив из 1000 и более элементов нужно найти среднее...
Проект большой не вижу смысла выкладывать... но факт в том что после того как я складываю некоторое количество элементов из массивов они выходят за пределы (сумма становится слишком большой)... поэтому результаты получаются неадекватными..
0
|
Модератор
12830 / 7567 / 1764
Регистрация: 25.07.2009
Сообщений: 13,959
|
|
20.04.2012, 16:59 | 4 |
Складывайте их (значения) в переменную типа double, а то и long double, если всё так серьёзно. Целое число в качестве среднего арифметического - всё равно редкость...
0
|
0 / 0 / 0
Регистрация: 30.03.2011
Сообщений: 41
|
|
20.04.2012, 17:03 [ТС] | 5 |
У меня пока что у массивов такая размерность...
а потом может стать и еще больше... просто хотелось бы вообще быть независимым от переполнения...может кто-то какой-то алгоритм а то условно будет у меня 10000 элементов с большим значением... и там уже никакие типы не помогут...
0
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
20.04.2012, 17:23 | 6 |
А сколько у тебя целых, какого они типа и какого реального диапазона? Если signed showt int складывать через преобразование в signed long int, то переполнение гарантировано не наступит при сложении 65535-ти слагаемых, так как удвоение разрядности расширяет диапазон квадратично, а удвоение диапазона происходит при повышении разрядности всегда на 1 бит. Мало? Эйси. Сложи по частям, каждую из сумм раздели, а потом найди средневзвешенное от этих средних. У тебя уже signed long int? Ну тогда складывай в __int64 (он же hyper), влезет больше 4-х миллиардов слагаемых. Уже hyper? Создай 128-ми битный тип, операторы для его сложения и деления и приведения hyper к нему и работай в этом типе.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||||||
20.04.2012, 17:27 | 7 | |||||
Среднее арифметическое:
Думаю идея понятна.
1
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
20.04.2012, 17:29 | 8 |
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
20.04.2012, 17:30 | 9 |
taras atavin, причем здесь это? Мы не складываем все переменные в одну, поэтому переполнения быть не может, так как среднее арифметическое максимум будет равно наибольшему элементу.
0
|
79 / 79 / 8
Регистрация: 14.10.2009
Сообщений: 121
|
||||||
20.04.2012, 17:32 | 10 | |||||
А вообще если есть возможность, то такую математику лучше на лиспе писать. Большинство его реализаций поддерживают длинную арифметику.
0
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
20.04.2012, 17:34 | 11 |
Попытка деления сразу при работе в целом типе может приводить к нулевому результату, если количество усредняемых данных больше самих данных, дробные операции относительно дорогие, особенно деление, а если делить в конце, то он и мантиссу double побоится переполнить, у тебя же простейший случай, где переполнение и так не грозит.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
20.04.2012, 17:36 | 12 |
0
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
||||||
20.04.2012, 17:42 | 13 | |||||
0
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
20.04.2012, 18:05 | 14 | |||||
0
|
11 / 11 / 5
Регистрация: 25.11.2011
Сообщений: 147
|
||||||
20.04.2012, 19:10 | 15 | |||||
Добавлено через 14 минут while (a!=0); и d=(b+a)/c
0
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
20.04.2012, 19:40 | 16 | |||||
0
|
Заблокирован
|
||||||
20.04.2012, 19:57 | 17 | |||||
А у меня эта задача ассоциируется вот с таким кодом:
Исходный массив должен быть дополнен нулями так, чтобы общее число элементов в этом новом массиве являлось некоторой степенью двойки.
0
|
Модератор
12830 / 7567 / 1764
Регистрация: 25.07.2009
Сообщений: 13,959
|
|
20.04.2012, 19:59 | 18 |
taras atavin, не потому ли у Toshkarik сделано
? И получается всё, как надо, а так-то любую идею можно забыдлокодить до полной непригодности...
1
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
20.04.2012, 20:00 | 19 |
Вы видели вообще мой код? Например что тип переменной double? И что там каст к double? Тем более я просто показал, что можно делить каждую переменную в отдельности для избежания переполнения. Если без каста, то тут уже достаточно привели примеров, использующий данный метод. Единственный пример показался не правильным из последнего поста предыдущей страницы, так как рекурсии нужно избегать при обработке большого количества данных.
0
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
20.04.2012, 20:02 | 20 | |||||
То есть
дробные операции дороже целых равно разрядности.
0
|
20.04.2012, 20:02 | |
20.04.2012, 20:02 | |
Помогаю со студенческими работами здесь
20
Нахождение среднего арифметического элементов массива Реализовать нахождение среднего арифметического элементов массива Нахождение среднего арифметического и геометрического двух чисел Нахождение среднего арифметического трех целых чисел или суммы двух вещественных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |