Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: среднее арифметическое проблема переполнения 64 разрядных чисел (C/C++)  (Прочитано 2569 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн _XDD_

  • Автор темы
  • Участник
  • *
  • Сообщений: 108
    • Просмотр профиля
надо найти среднее арифметическое чисел от 1 до 10^12, которые делятся на каждую из цифр состовляющие их.

задача сделанна только до 10^7, затем у меня переполнение происходит((

делал как со школы учили: сложить все и поделить на кол-во...
использовал u_int64_t (((

может какой алгоритм еще есть другой? или 128 разрядные типы?


P.S.
на справке MS находил информацию о 128 разрядных, но это их личные тип ((

P.P.S.
т.к использовать надо в разных процессах подсчет, то я заранее знаю сколько у меня всего чисел, ср.арифметическое которых надо считать


Оффлайн quiet_readonly

  • Участник
  • *
  • Сообщений: 133
    • Просмотр профиля
Чтобы посчитать среднее арифметическое, не обязательно надо считать сумму, хватит промежуточного целочисленного среднего арифметического, остатка и количества уже обработанных чисел. Скорее всего в этом и состоит хитрость задачи.

Оффлайн Rosik

  • Активист
  • *
  • Сообщений: 255
  • по жизни Rosik
    • Просмотр профиля
Может перевести все в double при вычислении среднего арифметического?

, которые делятся на каждую из цифр состовляющие их.

А как вы поступаете с числами, содержащими ноль?

Оффлайн yorik1984

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 1592
  • Кто не хочет, ищет причины
    • Просмотр профиля
если известно количество чисел, то вы сначала сразу поделите ваши числа на это количество а потом просумируйте уже иэти значения. И оно не привысит 10^12 никогда!
(1+2+3)/3=1/3+2/3+3/3
Более того задача будет решена даже для числового ряда, где максимальное число составит 2^64-1
"Разделяй и властвуй"
« Последнее редактирование: 16 Мая 2013, 12:47:52 от yorik1984 »

Оффлайн _XDD_

  • Автор темы
  • Участник
  • *
  • Сообщений: 108
    • Просмотр профиля
yorik1984,
ок, числа в диапазоне от 10^10 до 10^11.

double занимает 8 байт, значит если не ошибаюсь его максимум в положительном такой же как у 32 разрядного числа беззнакового?

а 10^10 требует 64 разрядов (


Rosik,
обрабатываю, если нужен фрагмент кода, скину (по алгоритму / и % по 1 цифре с числа вырезаю и проверяю)





Пользователь решил продолжить мысль 16 Мая 2013, 13:19:41:
есть ли беззнаковое 64 разрядное число с плавающей точкой?

unsigned double на отрез отказыается компилятор (

а обычный double переполнится даже если делить каждое число подходящее на кол-во(

Пользователь решил продолжить мысль 16 Мая 2013, 13:27:48:
yorik1984,
в том и дело, что когда я понял что так можно, я сразу же и понял что ср. значение будет не целым числом...
тоесть надо 64 с плавоющей (
« Последнее редактирование: 16 Мая 2013, 13:27:48 от _XDD_ »

Оффлайн yorik1984

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 1592
  • Кто не хочет, ищет причины
    • Просмотр профиля
есть такой тиа давнных как
Цитировать
unsigned long long  0 to 18446744073709551615

Пользователь решил продолжить мысль 16 Мая 2013, 13:41:05:
а кто вам сказал, что значение должно быть целым числом? оно никогда им не было. Вы себя запутали

Оффлайн _XDD_

  • Автор темы
  • Участник
  • *
  • Сообщений: 108
    • Просмотр профиля
yorik1984,
ну я о чем и говорю, изначально неправильно думал что результат будет целочисленным, потом идя домой решил что надо как вы и сказали каждое число делить на кол-во понял что мне нужен тип с плавоющей точной для результата.

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

P.S.
u_int64_t это по разрядам тот же unsigned long long.
А нужен тип такого же разряда только с плавоющей точкой(

Пользователь решил продолжить мысль 16 Мая 2013, 15:23:09:
итак:

оказалось есть тип long double, который 16 байт, ну думаю все, готово.

А фиг там. Запускаю с n^7 и все норм. n^8 и дохнет. включил отладку, заметил что даже 1 процесс в своем диапазоне(например главный
10000000 до 20000000 не проходит все числа)

закоментил остальное чтобы можно было протестить. Собственно еще сделал чтобы каждое число выводило которое проверяет чтобы знать что не зависло где то. Останавливается у меня на 12161364 упорно. Дай думаю гляну может в ф-и проверки ошибка, не, работает. запустил чтобы вместо диапазона так же проверило 12161364 все эти разы. фиг там, на 81** раз сдохло.
Записал другое и прошло.


у кого есть время, посмотрите пожалуйста?(( хоть бы 1 диапазон пройти полностью в 10^8 ((

(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 16 Мая 2013, 15:25:39 от _XDD_ »

Оффлайн Rosik

  • Активист
  • *
  • Сообщений: 255
  • по жизни Rosik
    • Просмотр профиля
Ухты.

А зачем вам пайпы?
Дабла без знака не существует, ибо незачем. Дабл хранит число в экспоненциальной форме и меняется от 10^-308 до 10^308. Как положительные, так и отрицательные. По точности - примерно 16 знаков после запятой, и все понимают, что если сложить 10^100 и 1 то будет все равно 10^100

В общем пойду поковыряю, интересная задачка

Оффлайн _XDD_

  • Автор темы
  • Участник
  • *
  • Сообщений: 108
    • Просмотр профиля
Rosik,
задание просто такое, реализовать используя 9 процессов и использовать неименованный канал для обмена.

я даже не знал что в double столько уместить можно )) думал 8 байт это 2^-32 и 2^32 (ну +-1)...

Оффлайн Rosik

  • Активист
  • *
  • Сообщений: 255
  • по жизни Rosik
    • Просмотр профиля
_XDD_,
если я правильно понял, то числа, содержащие 0 магическими не являются (ну тк на 0 делить нельзя)

Пайпы все усложняют. Дабл справляется прекрасно.
для чисел до 10^8
326499 magick numbers
average = 41326660.058331
посчиталось за 5 сек

для чисел до 10^9
2087730 magick numbers
average = 422273790.276932
расчет занял 46 сек.

Страшно представить, сколько вы до 10^12 считать будете, если сложность растет по экспоненте.
Сейчас надо прерваться, мой код вот
http://pastebin.com/ffdxpkqy

Оффлайн _XDD_

  • Автор темы
  • Участник
  • *
  • Сообщений: 108
    • Просмотр профиля
Rosik,

разбил на процессы, в 8 точно считает)) запустил на 11, жду :D
спасибо )))
эх, знать бы почему мой дох вариант... не я канешь понял что записывать в канал столько раз эт кака на быстродействие, но все ж таки мистически так дох он ))

(Нажмите, чтобы показать/скрыть)

 

Страница сгенерирована за 0.045 секунд. Запросов: 25.