16,32 т.д.-байтовая переменная для утопического приложения

Следующие строки являются частью моей действительно «бесполезной» программы на C++... которая вычисляет степень двойки только до 2^63 вместо 2^128, «которое запрашивается» из-за длины «unsigned long long» переменная, которая предлагается для чисел с точностью до 15 цифр...!!!

Только это.... Мне нужна переменная размером 16 или более байтов... которая не предоставляется:

-__int128 (Visual Studio 2010 превращает буквы в синие, но красная линия и ошибка в отладке: «ключевое слово не поддерживается в этой архитектуре» 32-разрядная система)

-Boost::Projects... после того, как я погуглил из-за того, что я новичок, "я потерялся во вселенной", когда наткнулся на профессиональные сайты (буст::bigint...существует??? нет? риторический вопрос)

(-Многопечатание, конечно)

int main()
{   
    unsigned long long result;
    int i;
    const int max=128;

    for(i=0, result=1ll; i <= max; ++i,result *=2 )
        cout<<setw(3)<< i <<setw(32)<< result <<endl;

    system("pause");
    return 0;
}

person foldingAthellas    schedule 10.05.2013    source источник
comment
С другой стороны, проверка привязки в вашем цикле неверна, с 128 битами без знака вы можете перейти от 2⁰ к 2exponent(128)-1. Ваш цикл выполняется 129 раз (от 0 до 128), должно быть 128.   -  person Étienne    schedule 11.05.2013
comment
@Étienne Первое замечание верно (я столкнулся с этим с меньшими циклами 64,32 и т. Д., Используя переменные 8 и 4 байта ... С другой стороны, второе неверно, с моей точки зрения. Если for(expressions;test;increasement)statements; и имеет порядок test=>statements=>increasement=>test=>statements etc, когда он работает, поскольку x^0=1, если вы запустите эту программу, вы получите результат: 2^0=1 , 2^1=2 , 2^2=4 2^3=8 и т. д.   -  person foldingAthellas    schedule 11.05.2013
comment
Со 128-битной переменной будет отображаться 2^0=1 2^1=2 2^3=8...2^128=0, потому что 2^128 переполнится. С unsigned long long он уже отображает 2 ^ 64 = 0.   -  person Étienne    schedule 11.05.2013


Ответы (3)


Вы можете найти реализацию «bigint» на C++, которая реализует operator<<() для вывода в ostream, но если все, что вы хотите сделать, это вывести степень двойки в консоль или текстовую строку, и вам не нужно на самом деле делать «bigint», математике (за исключением вычисления этих степеней двойки), есть более простой подход, который даст вам степени двойки настолько большими, насколько вы хотите, и наберитесь терпения, чтобы просмотреть:

Храните каждую десятичную цифру (числа от 0 до 9) как отдельный объект, возможно, как массив символов или целых чисел или в std::list цифр. Преимущество использования std::list состоит в том, что вы можете легко добавлять новые разряды цифр впереди по мере увеличения вашего числа, но вы можете сделать это почти так же легко, сохраняя цифры в обратном порядке в std::vector (конечно чтобы напечатать их, вам нужно выполнить итерацию от конца к началу, чтобы напечатать цифры в правильном порядке).

Как только вы выясните, как вы хотите хранить цифры, ваш алгоритм удвоения числа будет следующим: перебирать цифры большого числа, удваивая каждую (конечно, по модулю 10) и перенося любое переполнение (т. е. логическое значение, которое говорит, если его результат... до %10... был больше 9) от этой цифры до следующей. На следующей цифре сначала удвойте ее, а затем добавьте 1, если предыдущая цифра переполнилась. И если этот результат переполняется, переносите это переполнение на следующую цифру и продолжайте до конца всех цифр. В конце цифр, если удвоение последней цифры и добавление любого переполнения из предыдущей цифры вызвало переполнение этой последней цифры, добавьте новую цифру и установите ее на 1. Затем распечатайте полученный список цифр.

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

person phonetagger    schedule 10.05.2013

Встроенные функции SSE и AVX достигают 256 байт, учитывая современный процессор. Их зовут __m128i и __m256i.

person MSalters    schedule 10.05.2013
comment
Но однажды он у него в баране. Как собираетесь печатать? - person felknight; 11.05.2013
comment
Плюс __m128 - это 4 32-битных числа с плавающей запятой. Я считаю, что он хочет целочисленной точности. Поплавки в конечном итоге будут чем-то вроде 1.329803e+36. - person felknight; 11.05.2013
comment
А, да, это должно было быть __m256i (обратите внимание на суффикс i). Печать, конечно, будет вашей проблемой; std::cout<< не знает о встроенных функциях SSE. - person MSalters; 11.05.2013
comment
Я обнаружил, что необходимо #include ‹emmintrin.h›, но кого вы можете вычислить и распечатать.... Я был бы рад, если бы кто-нибудь мог привести мне пример программы adove, использующей _m128int - person foldingAthellas; 11.05.2013

128-битное целое число — это действительно большое целое число. Вы должны реализовать свой собственный тип данных. Вы можете создать массив short, хранить там числа (цифры) и реализовать умножение, как вы это делаете в своей математической тетради, это, вероятно, самый простой подход.

введите здесь описание изображения

Это не закончено, конечно! "2" все еще не хватает ;)

person cubuspl42    schedule 10.05.2013