Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/76: Рейтинг темы: голосов - 76, средняя оценка - 4.92
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516

BigInteger в For

23.07.2019, 17:26. Показов 16712. Ответов 74
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с проблемой того, что в цикле for нельзя использовать BigInteger, не смотря на то, что это целочисленный тип. Кто-нибудь знает решение?
Пример:
Pascal
1
2
3
4
begin
  for i: BigInteger := 1 to 2 do //Ошибка: ожидался порядковый тип
    i.print;
end.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.07.2019, 17:26
Ответы с готовыми решениями:

Преобразовать Integer в BigInteger
Как преобразовать Integer в BigInteger?

Корень из числа типа BigInteger;
Доброго времени суток! Возник такой вопрос, у нас есть число типа BigInteger, а как из него извлечь корень? Можно ли это вообще сделать?...

Процедура Val/StrToInt, выводящая BigInteger
Я написал в дизайнере форм рабочий "переводчик периодической в десятичную дробь". Программа использует Val() для получения числа из...

74
 Аватар для Sun Serega
2357 / 1460 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
10.08.2019, 16:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ProMix0 Посмотреть сообщение
Unable to find an entry point named 'clEnqueueFillBuffer' in DLL 'opencl.dll'
А, это значит что у вас старая версия OpenCL, в которой ещё не добавили clEnqueueFillBuffer

Замените .AddFillValue(1) на .AddWriteArray(ArrFill(10, 1))

Добавлено через 1 минуту
Вообще, .AddWriteArray(ArrFill медленнее и менее эффективно по памяти, потому что сначала создаёт массив в оперативной памяти, и перебрасывает его содержимое в память GPU. В то время как .AddFillValue - берёт 1 значение (в данном случае с типом integer) и проходится по всей области памяти буфера и заливает её этим значением.

На будущее, если вам надо залить буфер с большей эффективность, но не используя .AddFillValue - лучше использовать Kernel, принимающий значение и его размер (в байтах) и заливающий им всю память буфера.

Добавлено через 4 минуты
Цитата Сообщение от ProMix0 Посмотреть сообщение
P.S. У вас в OpenCLABC где-то было написано "удленитель", а правильно "удлинитель".
Да, а это будет исправлено само по себе, по справке ещё пройдутся целиком, проверят на орфографию и т.п. Ну, я сделал заметку.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
12.08.2019, 12:12  [ТС]
В объекте Buffer указывается размер всех переменных, которые описаны в *.cl, или только тех, которые передаются в файл? И как быть с BigInteger?

Добавлено через 3 часа 28 минут
Цитата Сообщение от Sun Serega Посмотреть сообщение
Я так с OpenGL и OpenCL сделал. То есть я сделал простенький парсер
А PascalABC.NET -> C у вас нету?

Добавлено через 10 минут
И да, ещё, как лучше сделать - что бы каждая из ~1000000 итераций в *.cl сама сравнивала результаты друг с другом или возвращала результат, а потом ~1000000 чисел сравнивались?
0
 Аватар для Sun Serega
2357 / 1460 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
12.08.2019, 15:14
Цитата Сообщение от ProMix0 Посмотреть сообщение
В объекте Buffer указывается размер всех переменных, которые описаны в *.cl, или только тех, которые передаются в файл?
1. В файл ничего не передаётся. Лучше говорить как то вроде "в cl код".
2. Буфер хранит не переменную. Он хранит права на доступ к куску памяти на GPU.
Его размер - указывается в байтах. Сколько байт вам надо чтоб сохранить какие то данные для передачи в карнел - столько выделяйте. И сколько вы выделили - столько будет доступно из cl кода, потому что в cl коде вы получаете указатель на тот кусок памяти, когда передаёте буфер как параметр в карнел.

Цитата Сообщение от ProMix0 Посмотреть сообщение
как быть с BigInteger?
Вообще, у BigInteger есть метод, возвращающий массив байт из содержимого. Вот только вам это не надо, как и сами BigInteger и я вам уже объяснил. Надо сразу всё массивом байт хранить...

Цитата Сообщение от ProMix0 Посмотреть сообщение
А PascalABC.NET -> C у вас нету?
Парсер для перевода конкретного кода и парсер общего использования - это разные вещи. Тот уровень качества что нужен для первого - будет неюзабелен для второго, ибо куча странных ошибок и не продуманных ситуаций-исключений. Ну а более конкретно - у меня и говнокоженого парсера из PABC.Net в C нету...

Цитата Сообщение от ProMix0 Посмотреть сообщение
И да, ещё, как лучше сделать - что бы каждая из ~1000000 итераций в *.cl сама сравнивала результаты друг с другом или возвращала результат, а потом ~1000000 чисел сравнивались?
Общение ядер друг с другом практически не существует. Есть синхронизация (то есть ожидание пока какое то другое ядро не выполнится), но чтоб сравнивать/складывать информацию из результатов 2 ядер - эту информацию сначала надо сохранить в буфер.

Ну а далее - я знаю 2 варианта (может ещё есть что то, но это вам самим догадываться:
1. Сравнивать результаты на самом CPU. Но это будет довольно медленно.
2. Передавать информацию в специальный карнел, который сравнивает по парам. И так несколько раз.
То есть допустим есть 1024 результата, первый вызов того карнела сравнит 1 и 2, 3 и 4 и т.д. И сохранит лучшие результаты в 1,3,5,7 и т.д.
Второй вызов уже будет сравнивать 1 и 3, 5 и 7, 9 и 11 и т.д. И сохранит лучшие результат в 1, 5, 9 и т.д. И так повторять пока не останется только 1 результат.
Разумеется, при этом надо вместе с результатом - передавать id теста, который дал этот результат. Ведь нам как раз надо узнать id лучшего результата, а не сам лучший результат.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
19.08.2019, 11:50  [ТС]
В итоге, я так и не понял - можно ли производить расчёты без *.cl файла? И что возвращает get_global_id ?

Добавлено через 38 секунд
И как array of byte преобразовать в число?
0
 Аватар для Sun Serega
2357 / 1460 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
19.08.2019, 11:57
Цитата Сообщение от ProMix0 Посмотреть сообщение
можно ли производить расчёты без *.cl файла
Без файла можно, но код из него должен быть. Код на паскале на GPU выполнить нельзя.

Цитата Сообщение от ProMix0 Посмотреть сообщение
что возвращает get_global_id
Если не знаете англ. - юзайте гугл переводчик. Ссыли де всё искать я вам уже дал, всю справку не_моего продукта пересказывать я точно не буду.

Цитата Сообщение от ProMix0 Посмотреть сообщение
как array of byte преобразовать в число?
В какое? В BigInteger? Зачем? Чтоб сложить - считайте как в столбик. Где каждый байт - 1 цифра (в 256-ричной СС). То есть если 1 из цифр переполняется - перебрасывайте 1 в следующий порядок.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
19.08.2019, 14:08  [ТС]
Цитата Сообщение от Sun Serega Посмотреть сообщение
Если не знаете англ.
От того, что я "получу глобальный ID", мне не станет понятнее, что это.
Цитата Сообщение от Sun Serega Посмотреть сообщение
Чтоб сложить - считайте как в столбик
Просто я нашёл функцию у BigInteger - ToByteArray, и только пока писал ответ - понял, как преобразовать обратно.
P.S. Есть, на пример, какой-нибудь тип, в который записывается двоичное число?
0
 Аватар для kotAV
142 / 108 / 57
Регистрация: 15.09.2017
Сообщений: 425
19.08.2019, 16:52
Цитата Сообщение от ProMix0 Посмотреть сообщение
какой-нибудь тип, в который записывается двоичное число
У всех типов внутри двоичное представление. А так только строка.
0
 Аватар для Sun Serega
2357 / 1460 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
20.08.2019, 00:22
Цитата Сообщение от ProMix0 Посмотреть сообщение
От того, что я "получу глобальный ID", мне не станет понятнее, что это.
Тогда почему вы вы ещё не прочитали справку OpenCL? В ней это подробно описано.
Не ждите что я всю инфу на блюдечке с золотой коёмочкой вам принесу. Я помогаю только пока вижу что вы пытаетесь прикладывать усилия сами, но сейчас я не вижу.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
20.08.2019, 07:18  [ТС]
Ладно, понятно, но у меня вопрос - что бы не использовать BigInteger мне нужно передать:
число, к которому я буду прибавлять get_global_id (если я всё правильно понял) и переводить его в двумерную бинарную таблицу;
или строку из нулей и единиц, к которой я буду (неизвестно как) прибавлять get_global_id в двоичной СС;
или саму двоичную таблицу.
Но проблема последних двух вариантов в том, что преобразования числа надо проводить на CPU, а это долго. Что посоветуете?

Добавлено через 52 минуты
Точнее, проблема последнего варианта.

Добавлено через 48 минут
И да, куда кинуть файл, что бы программа могла его скачать?

Добавлено через 31 секунду
Я про сайт.
0
 Аватар для Sun Serega
2357 / 1460 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
20.08.2019, 07:22
Цитата Сообщение от ProMix0 Посмотреть сообщение
или саму двоичную таблицу.
Метод очередей буферов .[Add]WriteArray берёт содержимое массива как есть в памяти. Все элементы массива в памяти располагаются последовательно, поэтому достаточно взять адрес начала содержимого массива и его размер, чтоб скопировать его в буфер. Никаких преобразований.

И работает это с массивами любой размерности и с любыми размерными типами элементов (с ссылочными не сработает, надеюсь, понятно почему). Но одномерный массив байт лучше всего, потому что при его заполнении на CPU - проверяется не так много границ индексов.

Добавлено через 2 минуты
Цитата Сообщение от ProMix0 Посмотреть сообщение
И да, куда кинуть файл, что бы программа могла его скачать?
Если вам надо перекинуть файл между 2 компьютерами, оба из которых активны и выполняют ваш код - используйте сокеты а не сайты.
Иначе - подробнее объясните что и зачем.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
20.08.2019, 07:35  [ТС]
Проблема передачи массивов в том, что на каждый из ~1000000 потоков нужно передать собственный массив, а со строками и числами - все получают одно и то же, но преобразуют с помощью get_global_id.
А сайт мне нужен из-за того, что IP сервера может поменяться (то есть сервер переедет на другой комп), поэтому я хочу, что бы сервер скачивал с сайта .txt и читал IP (пробовал с GitHub и Яндекс.Диском, в первом случае он не смог создать защищённый канал, а во втором скачал страницу).
0
 Аватар для Sun Serega
2357 / 1460 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
20.08.2019, 08:20
Цитата Сообщение от ProMix0 Посмотреть сообщение
на каждый из ~1000000 потоков нужно передать собственный массив
Зачем это? Передавайте id первого потока, а id остальных потоков вычисляйте локально для каждого потока.
Имеет смысл делать 256, 256*256 или 256*256*256 потоков, чтоб можно было не передавать последние несколько байт массива. Вместо них get_global_id будет возвращать оставшуюся часть идентификатора.

Цитата Сообщение от ProMix0 Посмотреть сообщение
в первом случае он не смог создать защищённый канал
Поищите на StackOverflow, там надо какой то сертификат выбрать при создании WebClient.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
20.08.2019, 08:35  [ТС]
Цитата Сообщение от Sun Serega Посмотреть сообщение
Передавайте id первого потока, а id остальных потоков вычисляйте локально для каждого потока
Я так и делал со строками и числами, но с матрицей будет сложнее. Ладно, реализую.
0
 Аватар для Sun Serega
2357 / 1460 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
20.08.2019, 08:47
Сложнее если вы будете пытаться степени десяток потоков за раз выполнять. А если 256, 256*256 или 256*256*256 потоков за раз - наоборот проще.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
20.08.2019, 11:48  [ТС]
Сейчас я не о том, какая степень у десятки, а как это реализовать. 256 в степени - не проблема, а с увеличением двоичной матрицы на двоичное число - так себе идея. На мой взгляд, проще передать двоичную строку и увеличить её, а потом перенести в матрицу.

Добавлено через 2 часа 56 минут
Знаете, я решил проблему с передачей IP довольно-таки экзотичным способом: так как разобраться с сертификатами я не смог, я решил посмотреть, что я там скачал в .txt с яндекса, и случайно наткнулся на название файла 'IP.txt'. Тогда я назвал файл IP127.0.0.1PI.txt, скачал файл строкой, и по буквам P и I вычленил IP.
Кусочек кода, если интересно:
Pascal
1
2
3
4
5
  var w := new WebClient();
  var IPS := w.DownloadString('https://yadi.sk/d/_cGBP77ieNcG8Q').ToWords('I').Println;
  while not ((IPS.First.ToString.First = 'P') and (IPS.First.ToString.Last = 'P')) do
    IPS := IPS.Skip(1);
  var IP := IPS.First.ToString.ToWords('P').JoinIntoString.Println;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.08.2019, 11:48

Метод BigInteger.GreatestCommonDivisor (BigInteger, BigInteger)
Как использовать в C# windowsforms метод BigInteger.GreatestCommonDivisor (BigInteger, BigInteger)? Пример кода.

Как делить одно число BigInteger на другое BigInteger, при чем не теряя остаток
Помогите пожалуйста. Надо поделить одно число BigInteger на другое, при чем в результате сохранить весь остаток

Бинарное возведение в степень числа типа BigInteger в степень Biginteger
Здравствуйте. Не могу реализовать алгоритм бинарного возведения в степень. Есть 2 экземпляра BigInteger p,q. По методу Pow не...

BigInteger в степени BigInteger
Возможно ли возвести переменную типа BigInteger в такую же? Метод ModPow отпадает из-за необходимости mod'a. Спасибо.

BigInteger в степени BigInteger
Имеются переменные y,r,s,p типа BigInteger. Необходимо вычислить (y^r*r^s) % p. Какие предложения по поводу вычисления данной формулы? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
75
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru