Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с алгоритмом 
:(
    Опции темы
Akina
Дата 1.3.2013, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Вот только что промоделировал на случайном массиве из 64к элементов в пределах unsigned long.
Если вычисления проводить в double - ну более-менее, хотя один расчёт из двадцати дал ошибку на единицу (102201990, расчётно 102201989).
Счас попробую в single (он, как и ulong, 4 байта)... боюсь, будет грустно.

Это сообщение отредактировал(а) Akina - 1.3.2013, 09:11


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Akina
Дата 1.3.2013, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Один расчёт из 10 дал ошибку - 17123904, расчётно 17123903...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 1.3.2013, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



думаю, лучше считать вместо произведения сумму квадратов - ошибки меньше будут


--------------------
qqq
PM WWW   Вверх
Akina
Дата 1.3.2013, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(maxim1000 @  1.3.2013,  12:19 Найти цитируемый пост)
думаю, лучше считать вместо произведения сумму квадратов 

1*1+8*8=4*4+7*7=65
аналогично с кубами 
1*1*1+12*12*12=9*9*9+10*10*10=1729
То же и с остальными степенями... не пойдёть.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 1.3.2013, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(Akina @  1.3.2013,  11:36 Найти цитируемый пост)
1*1+8*8=4*4+7*7=65
аналогично с кубами 
1*1*1+12*12*12=9*9*9+10*10*10=1729
То же и с остальными степенями... не пойдёть. 

то, что квадраты требуют больше места, чем числа - ожидаемо

просто, если среди чисел нет уж очень большого неравенства (типа, одно огромное, а остальные маленькие), то в случае с квадратами результирующее число будет меньше

понятно, что это уже использует какие-то предположения о числах...


--------------------
qqq
PM WWW   Вверх
maxim1000
Дата 1.3.2013, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



о...

если предположить, что в дополнительных переменных у нас достаточно бит для хранения любого числа из массива, то можно найти числа по половинкам:
1. сначала рассматриваем младшую половину бит каждого элемента, считаем для них суммы и суммы квадратов - всё поместится, находим пару младших половинок
2. то же самое для старших - находим пару старших половинок

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


--------------------
qqq
PM WWW   Вверх
volatile
Дата 1.3.2013, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



Цитата(Akina @  1.3.2013,  08:14 Найти цитируемый пост)
с умножением и делением будет большая проблема - потеря точности... 

Цитата(volatile @  1.3.2013,  00:05 Найти цитируемый пост)
можно решить c 2-мя переменными (достаточной точности.)

а точнее, 
переменная P Должна быть в 2 раза длиннее чем типы массива.
переменная S Должна иметь на 1 бит больше чем типы массива.

Тогда решаецца строго, для любых данных. (при аккуратном программировании).

double не подойдет для 32 разрядов, так как там 56 бит (если не ошибаюсь.) а нужно 64 битов мантисы.
float тем более.

long double в gcc, должен подойти.  long double у M$ не пойдёт.
Ну или делать как предлагает maxim1000, длинную арифметику вручную.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0718 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.