LINUX.ORG.RU

Работа со 128-битными числами в С++

 


0

2

Нужно обработать числа величиной 10^30 на C++. Сначала нужно умножить на простой int, а затем вывести на экран.

Пример:

a = 10^28
b = 10000
c = a * b (т.е. с равно 10^32)

c нужно вывести на экран.

UPD:

Вдобавок нужно в Ubuntu 13.04 собрать бинарник для Windows 7 x86, используя MinGW.

★★★★★

Последнее исправление: Root-msk (всего исправлений: 1)
Ответ на: комментарий от ashinkarov

Да я побывал.

typedef __int128_t int128_t;

Только как вывести на экран int128_t?

Root-msk ★★★★★
() автор топика
struct my_int128_t {
  uint64_t u;
  uint64_t v;
}

my_int128_t my_int128_sum(my_int128_t, my_int128_t);
my_int128_t my_int128_div(my_int128_t, my_int128_t);
my_int128_t my_int128_mul(my_int128_t, my_int128_t);

Реализация будет еще на пять строк.

Reset ★★★★★
()
Ответ на: комментарий от Root-msk

Во-первых, не __int128_t, a __int128, а во-вторых, зачем тебе такая зависимость от гцц? Не хочешь буста (гмп тянуть - не лучше буста), напиши свое, как Reset советует.

p.s. признайся, за сколько купил пятизвездочный аккаунт?

cdshines ★★★★★
()
Последнее исправление: cdshines (всего исправлений: 1)

у меня sizeof(long double)=16. Но 10^32 и обычный дабл спокойно тянет (11 бит под степень тащем то). И даже обычный float (8 бит под степень).

Выводить и то и то через std::cout.

А зачем Вам 128 бит?

AIv ★★★★★
()
Ответ на: комментарий от cdshines

Во-первых, не __int128_t, a __int128

Опечатка. Сути не меняет MinGW (как и вообще какой либо GCC) на IA32 не поддерживает __int128. Платформа Windows x86 (т.е. 32-х битная Windows)

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от Reset

Реализация будет еще на пять строк.

struct my_int128_t {
uint64_t u;
uint64_t v;
}
my_int128_t my_int128_sum(my_int128_t, my_int128_t);
my_int128_t my_int128_div(my_int128_t, my_int128_t);
my_int128_t my_int128_mul(my_int128_t, my_int128_t);

Походу так и сделаю.

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от Reset

лицензия вирусная

На лицензию пофиг, ибо учебный код и смотреть никто не будет. Нужен бинарник.

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от AIv

std::cout.

Желательно

у меня sizeof(long double)=16

Очевидно на long double на MinGW выдает ерунду вида 1.68275e-317 исп. std::cout

А зачем Вам 128 бит?

Пользователь вводит 18 чисел, от 0 до 100, нужно вывести произведение всех чисел

(10^2)^18 = 10^36

2^128 около 10^38

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от Root-msk

Пользователь вводит 18 чисел, от 0 до 100, нужно вывести произведение всех чисел

Лол, и зачем это писать на С++? Возьми язык с нормальными числами.

anonymous
()
Ответ на: комментарий от anonymous

Лол, и зачем это писать на С++? Возьми язык с нормальными числами.

Очевидно же, в задании так написано.

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от invy

если только 128, то и самому за часик-другой навелосипедить можно.

Слишком много велосипедить не надо, ибо нужно так откоментировать, чтобы человек не очень знающий C++, мог понять

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от Root-msk

поставит под минЖВ ручками, я так делал от лени. А вообще он умеет из пакето тянуть@как то.

AIv ★★★★★
()
Ответ на: комментарий от AIv

а ТС не сказал про целые;-)

Целые.

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от AIv

поставит под минЖВ ручками, я так делал от лени. А вообще он умеет из пакето тянуть@как то.

Геморно. Проще Windows в виртуалку поставить и использовать Visual Studio, ибо у MinGW даже при float выводится бред вида -5.47479e-091.

Всегда какие-то проблемы при кросскомпиляции.

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от anonymous

поставь cygwin. Там уже есть gmplib и компилятор.

Куда? В Wine?

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от Reset

Плюсую. Годное, универсальное решение. Только если спп, то я бы сделал класс и перегрузил необходимые операторы.

Если производительность важна, сделал бы всё на асме с использованием каких-нибудь xmms/sse регистров и линковал бы как сишный код.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Ответ на: комментарий от Root-msk

Не знаю, у меня с MInGW все прекрасно работает, включая особо изощренные шаблоны.

Если соберетесь велосипедить, гляньте исходники питона - тамошний long довольно приятственно сделан, и может иметь любую длину.

AIv ★★★★★
()
Ответ на: комментарий от Root-msk

Не хочешь буста

Как его прикрутить к MinGW?

На странице загрузок прямо в списке изменений стоит

Changed to use _snwprintf to address a compile error due to the changed swprintf signature in recent versions of MinGW (#7373).

что намекает на то, что загрузил - и работает. По крайней мере в отличие от qt они не указывают, что бинарники исключительно для VC.

gag ★★★★★
()

юзай gmp, нормальная либа. И под винду нормально кросскомпилится если чо. Я на ней лет 5-6 назад велосипедил свой криптоэнжин на С, как раз работал с большими целыми - оч. уютная либка...

Jetty ★★★★★
()
Ответ на: комментарий от AIv

Не знаю, у меня с MInGW все прекрасно работает, включая особо изощренные шаблоны.

Да вроде заработало. Поставил double и все. Проверил и на float. Просто заново переписал блок констант (так констант около 10 штук) и заново вбил 18 чисел, вроде заработало. Видать, где-то ошибся при вводе.

гляньте исходники питона - тамошний long довольно приятственно сделан, и может иметь любую длину.

Я не знаю питона.

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от nanoolinux

Только если спп, то я бы сделал класс и перегрузил необходимые операторы.

Overkill

Если производительность важна, сделал бы всё на асме с использованием каких-нибудь xmms/sse регистров и линковал бы как сишный код.

А это совсем overkill

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от gag

На странице загрузок прямо в списке изменений стоит

Ой, какой гемор. Надо еще делать кросскомпиляцию буста. В топку. Ибо уже код рабочий нужен.

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от Jetty

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

ключевое слово - кросскомпилится.

Да и тащить либу, да объяснять, что за либа мне лень.

Root-msk ★★★★★
() автор топика
Ответ на: Big Integer Library от KennyMinigun

File Size Modification time
bigint-2010.04.30.tar.bz2 27673 2010-04-30 17:37:03 -0400

Как-то мертвенько она выглядит.

Root-msk ★★★★★
() автор топика

Всем спасибо

Заюзал double, собрал MinGW:

i686-w64-mingw32-g++ -static-libstdc++ -static-libgcc lab.cpp -o lab.exe

Работает в Wine и Windows x86. А больше и ничего не надо.

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от Root-msk

дык эта, оно нативно тоже компилится. Есть сборки (хидеры + архивы) для самых распространенных VC рантаймов.

Jetty ★★★★★
()
Ответ на: комментарий от Root-msk

Как-то мертвенько она выглядит.

Public Domain же. Тем более - что там делать, если она итак уже готова.

KennyMinigun ★★★★★
()
Ответ на: комментарий от Root-msk

Overkill

Что именно ты считаешь оверкилом? Перегруженые арифметические операторы и класс вместо структуры? Пф.

nanoolinux ★★★★
()
Ответ на: комментарий от Root-msk

А как прикрутить к MinGW.

На винфаке спрашивай, вендузоид

anonymous
()
Ответ на: комментарий от Root-msk

Пользователь вводит 18 чисел, от 0 до 100, нужно вывести произведение всех чисел

Обычную длинку писать 3 минуты

hired777
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.