|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
|||||||||||
Потестируйте скорость работы класса больших чисел19.08.2015, 17:47. Показов 6181. Ответов 100
Метки нет (Все метки)
Ребятки, сделал себе небольшой классик для больших чисел.
Типа того:
Если у кого есть результаты, приведите их пожалуйста. *мне нравятся большие числа и женщины, но с числами интереснее.
0
|
|||||||||||
| 19.08.2015, 17:47 | |
|
Ответы с готовыми решениями:
100
Скорость работы id и класса
|
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
|||||||||||
| 31.08.2015, 14:21 [ТС] | |||||||||||
|
mymedia, класс.. усё работает!
Подставил Вашу функцию вместо своего пойла. ![]() // generate BigInt from string: "M23", "12", "12-1", 12*3, "2^3", "2^3-1" "12*2^34+3" Кликните здесь для просмотра всего текста
0
|
|||||||||||
|
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
|
|||||||||||
| 06.09.2015, 12:52 | |||||||||||
|
SerVal, я вот тут что подумал. Надо было добавить в функцию genetate_number возможность построения отрицательных чисел. Для этого достаточно добавить необязательные +/- в регулярном выражении перед первой компонентой.
Вариант со значениями по умолчанию и с +/-
Мне кажется, умножить на 1 и прибавить 0 — не так страшно в плане производительности. Максиум один прогон по разрядам числа. А возведение в единичную степень вообще ничего не стоит: только вызов функции, проверка условия и моментальный возврат. В общем, можно убрать код, который пытается не сделать лишнего и сократить функцию на 20 строк. Впрочем, если уж так не хочется делать лишних действий, то лучше было бы совсем отказаться от значений по умолчанию и проверять наличие соответсвующих компонет непосредственно из results (результатов) распарсивания строки. Вариант с проверкой присутствия компонент и с +/-
Собстенно говоря, если не хотите "лишних" действий, то значения по умолчанию не нужны. Можно основываться на массиве results. Это массив строк, которые соответсвуют регулярным подвыважениям. Т.е. в results[1] хранится первая компонента числа, в results[2] — вторая и т.д. В results[0] хранится исходная строка. ИМХО, чем меньше кода, тем меньше в нём может быть ошибок, поэтому не стоит комбинирвать два подхода: со значениями по умолчанию и с проверкой присутствия компонент в строке. Как вам известно, спецификация исключений функции запрещает ей генерировать какие-либо исключения помимо указанных. Так вот моя функция может генерировать исключения только типа invalid_format, в случае если передана неверная строка. Все остальные случаи (например, опечатку в регулярном выражении) я считаю нешатными, и пусть лучше программа завершится с выводом отладочной информации, чем ошибка пойдёт распространяться дальше. Так будет проще исправить баг. Поэтому в вашем коде, возможно, нужно этот момент исправить. Впрочем, тут лучше реализовать ту стратегию реакции на ошибки, которая у вас принята.
0
|
|||||||||||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
||||||||||||
| 06.09.2015, 14:21 [ТС] | ||||||||||||
|
Ну и, как известно, интерфейс пользователя - засада ещё та. Всегда найдётся дядя, который введёт что-нибудь непредсказуемое. Ваша функция замечательно работает.. пусть работает. ![]() ***** 2 All: Библиотеку маленько оптимизировал: 1. распараллелил умножение методом Карацубы - на два ядра процессора. 2. пробное деление на простые числа меньше 1 000 000 - распараллелил на все ядра процессора. 3. число теперь можно задавать в виде "2*3^4-5" .. но всё равно очень медленно. ![]()
0
|
||||||||||||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
||||||
| 06.09.2015, 14:28 [ТС] | ||||||
0
|
||||||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
||
| 06.09.2015, 16:06 [ТС] | ||
![]() Правда, удобнее добавить весь проект для Visual Studio 2013. *экзешник TestBigInt.exe в директории TestBigInt\x64\Release Всё какбэ компилится и работает. Если у кого есть идеи как всё это ускорить/оптимизировать - напишите.
0
|
||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
||
| 06.09.2015, 16:30 [ТС] | ||
|
А ежели упаковать только несколько файлов, то надо объяснять какой куда пихать. И вообще, мне нравится, когда всё как для полных придурков... типа в стиле Микрософт.
0
|
||
| 06.09.2015, 16:48 | |
|
0
|
|
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
||
| 06.09.2015, 16:52 [ТС] | ||
![]() Вдруг без него не будет компилиться?
0
|
||
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
||
| 06.09.2015, 17:02 | ||
|
Короче, нужно оптимизировать операции сложения и умножения: переписать на ассемблере, либо воспользоваться интринсиками, а также нужно переделать карацубу - слишком много операций выделения памяти. Да и базу BASE можно увеличить до 9223372036854775808 вместо твоего жалкого миллиарда.
0
|
||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
|||
| 06.09.2015, 17:17 [ТС] | |||
|
*ассемблер не нужен - он не переносится на другое платформы и процессоры.
0
|
|||
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|||
| 06.09.2015, 17:37 | |||
|
Оставляем последний бит для переноса - итого у нас 63 бита. Значит базу можно взять равной 2^63.
0
|
|||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
|||||||
| 06.09.2015, 18:00 [ТС] | |||||||
Файл BigInt.h
И при умножении: (BASE-1) * (BASE-1) должно помещаться в long long. Может быть я что-то не понял, в Вашем предложении? Вообще-то, компилится всё это 3 секунды. Не могли бы Вы скомпилить с базой 9223372036854775808 и проверить результат, скажем, на факториале?
0
|
|||||||
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
||||
| 07.09.2015, 00:04 | ||||
|
Не очень хорошо, когда половина блока практически всегда простаивает впустую. Если не хочется возиться с SIMD, то всегда можно оптимизировать что-то другое. Но в твоей программе самой дорогой операцией является именно умножение, так что стоит начинать именно с него.
0
|
||||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
||||||||||||||||||
| 07.09.2015, 00:55 [ТС] | ||||||||||||||||||
![]() В какой библиотеке инструкция mulx? Вот я натяпал:
Может я какую-нибудь includ-у не прописал?Инструкцию lldiv я нашёл:
![]() Добавлено через 18 минут Умножение "столбиком" только если длинное умножать на короткое(на int, long или long long). Но и тут столбика нетути. Каждый элемент длинного умножается на короткое с учётом переносов и всё. А длинное на длинное умножается Карацубой - и тут "столбика" нетути. Вот умножение длинного на короткое:
![]() Не могли бы Вы показать несколько строчек кода?
0
|
||||||||||||||||||
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
||
| 07.09.2015, 01:06 | ||
|
Также есть интринсик _mulx_u64 и объявлен он в волшебном файле immintrin.h. Но возможно данная инструкция твоим процессором не поддерживается. Не по теме: Бла-бла-бла, совместимость, бла-бла, производительность. Всегда есть что-нибудь попроще, есть инструкции для переемножения двух 32 битных переменных с помещением результата в 64 битную переменную. Можно умножать сразу несколько пар чисел одновременно с использованием SIMD. Возможностей по оптимизации со стороны процессора множество, главное их найти и с умом применить.
0
|
||
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
| 07.09.2015, 01:14 | |
|
0
|
|
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|||
| 07.09.2015, 01:28 | |||
|
Если взять базу в виде степени двойки, то вместо деления и взятия остатка можно обойтись простыми битовыми сдвигами. От строчек 4-5 наверняка можно избавиться, все нелинейные блоки внутри циклов могут существенно замедлить их работу. в качестве развлечения меня не тянет этим заниматься, да и не дока я в этом.
0
|
|||
|
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
|
|||||||||||
| 14.09.2015, 23:35 [ТС] | |||||||||||
|
Тэээкс.. Скоро сказка сказывается, да не скоро дело делается.
![]() Но прогресс есть. Вместо умножения методом Карацубы подставил умножение FFT. Там где много умножений, всё маленько ускорилось. Например, генерация большого числа. Было:
Ну, и непонятно, насколько всё это быстро. На чём бы ещё проверить? Програмки, которая генерит большие числа и показывает часть десятичных цифр нигде нетути. *остальные тесты не ускорились, потому что там есть "деление" и "остатки от деления", которые надо как-то оптимизировать. Всем привет и хорошего настроения.
0
|
|||||||||||
| 14.09.2015, 23:35 | |
|
Создание класса для работы с массивами чисел Создать класс для работы с одномерным массивом целых чисел. Разработать следующие элементы класса:
ArrayList, скорость копирования больших структур, копирование по ссылке Реализация класса "Вектор" для работы с массивом чисел Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|