Как распечатать действительно большие числа в C++

Вы можете использовать шаблон тега для него

filters.py

register = template.Library()

 @register.filter(name="get_model_count")
 def get_model_count(model, app_label):
return apps.get_model(model_name=model, app_label=app_label).objects.count()

your_file.html

{% load filters %} #load it at the top of html file

<h2>{{ "your_model_name"|get_model_count:"your_app_name" }}</h2> #use this tag where you want to have count

Примечание: это если только для одного изменения количества согласно требованиям

5
задан iCodez 22 January 2015 в 16:17
поделиться

6 ответов

Ваш результат больше, чем длинный длинный тип - необходимо посмотреть на BigInteger или библиотеку произвольной точности, что-то как GMP

21
ответ дан 18 December 2019 в 05:29
поделиться

Те числа не впишутся ни в какие типы данных C++. Если Вы просто хотите распечатать их, сохраните числа в строке. Если Вы хотите сделать математику на нем, найдите математическую библиотеку произвольной точности и использование этим.

7
ответ дан 18 December 2019 в 05:29
поделиться

Если Вы хотите литералы это большое в Вашем коде, необходимо будет ввести их как строковые литералы и загрузить их в какой-то класс BigInt. Нет никакого способа выразить целочисленные литералы, настолько большие в исходном коде прямо сейчас (хотя C++ 0x, надо надеяться, обратится к той нехватке).

Если Вы пользуетесь библиотекой BigInteger, смотрите на stringToBigUnsigned функция в BigIntegerUtils.hh для создания большого целого числа от строки.

#include "BigUnsigned.hh"
#include "BigIntegerUtils.hh"     

 BigUnsigned  num1 = stringToBigUnsigned (
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
    "99999999999999999999999999999999999995"
    );
3
ответ дан 18 December 2019 в 05:29
поделиться

неподписанный интервал представляет системное слово. Сегодня, то слово истратит или в 2^32 - 1 или в 2^64 - 1, в зависимости от того, является ли Ваша система 32 битами или 64 битами. Вы поражаете ограничение.

Необходимо записать класс сверхбольшого числа или использовать один от 'сети.

Почему Вы делаете эту проблему так или иначе?

0
ответ дан 18 December 2019 в 05:29
поделиться

Ответ, который Вы получили, 18446744073709551496, происходит из-за Ваших 999... Причем 9 с усеченные при присвоении длинному длинному, плюс несколько операционных переполнений. Его детерминированное, но эффективно просто случайный набор битов.

1
ответ дан 18 December 2019 в 05:29
поделиться

Что это, Вы пытаетесь сделать? Вы понимаете основы двоичных и десятичных чисел? Почему 8 битов только содержат значения от 0 до 255, 12 битов 0 - 4095, и т.д.? Сколько битов требуется для содержания числа, которым Вы интересуетесь? Или лучше, как большой из числа интересуются Вы созданием? И Вы используете 9 с для создания числа больше? Что относительно шестнадцатеричного 0xF... вместо этого? Если Вы хотите самое большое неподписанное количество (в одном из стандартных целых типов) почему нет:

неподписанный длинный длинный a, b;

a =-1;//, который просто кажется неправильным смешиванием, подписанным и неподписанным, но это допустимо, число преобразовывается в неподписанный перед хранением

b = 0; b-;//делает то же самое как выше

Вам действительно нужна точность на том уровне? Вы понимаете, что это умножается, может потребовать результата дважды размер каждого операнда? 0xFF * 0xFF = 0xFE01 в этом случае при использовании целых чисел на 8 битов, Вы не могли бы сделать математики. Это только ухудшается, в то время как Вы продолжаете умножать 0xFF * 0xFF * 0xFF = 0xFD02FF.

Что пытается сделать?


Наблюдение Вашего ответа:

Я не видел эйлеров номер 8 прежде. Походит на хороший вопрос об интервью, поскольку только требуется несколько строк кода для решения.


Ваш другой ответ:

Числа...

Вероятно, потому что у нас 10 пальцев (и возможно 10 пальцев ног), мы растем с "основой 10". Наши часы основные 60 по большей части, но это было смешано с основой 10 для создания этого более сбивающим с толку. Так или иначе базируйтесь 10, средства для каждого заполнителя числа, у Вас есть одна из 10 уникальных цифр при достижении максимума в том месте, Вы переворачиваетесь к следующему месту. Это - весь материал начальной школы.

000
001
002
003
...
008
009
010
011
012
...

Посмотрите, как право, большая часть цифры имеет 10 символов (0,1,2,3,4,5,6,7,8,9) и когда это достигает последнего символа, это запускается и то слева от него инкременты одним. Это правило верно для всех систем нумерации основы.

Это верно для основы 2 кроме существует только два символа, 0 и 1

000
001
010
011
100
101
...

То же верно для восьмеричного, но 8 символов (0,1,2,3,4,5,6,7)

000
001
002
003
004
005
006
007
010
011
012
013
...

И то же верно для шестнадцатеричного, 16 символов (0,1,2,3,4,5,6,7,8,9, a, b, c, d, e, f)

000
001
002
003
004
005
006
007
008
009
00a
00b
00c
00d
00e
00f
010
011
012
013
...

Я собирался войти в whys использования двоичного файла по другим основаниям (как 10) в компьютерах. Нижняя строка легко иметь два состояния на или прочь, или высоко и низко. Два состояния похожи на два символа 1 и 0 в основе 2. Попытка сохранить электронику настроенной больше чем на два состояния в доступном напряжении жестка, по крайней мере, это раньше было, сохранение его около нулевых вольт или выше некоторого небольшого количества вольт относительно легко, таким образом, цифровая электроника использует два состояния, двоичный файл.

Даже простой задачей для человека в двоичном файле является длинная обветренная, простая математика второго класса, все еще много единиц и нулей. Таким образом восьмеричный стал популярным, потому что это позволило Вам думать в группах трех битов, и Вы могли использовать символы, с которыми мы знакомы как числа 0,1,2,3,4,5,6,7. Но группы четыре, который является другим питанием 2, дают людям, намного больше умственной вычислительной мощности, чем восьмеричный, шестнадцатеричный основано на 4 битах, который является также питанием 2. Мы должны были добавить больше символов к 10, которые мы одолжили у traditial арабской базы 10, таким образом, первые 6 из алфавита использовались. Восьмеричный крайне редко используется, можно сказать someones возраст, если они думают восьмеричные вместо шестнадцатеричного числа. (Я от шестнадцатеричного поколения, но работал с теми от восьмеричного поколения, которые борются с шестнадцатеричным числом, потому что они не могут добраться от восьмеричного до двоичного файла для преобразовывания в шестнадцатеричную систему в их уме).

Основа 10 в компьютере похожа на среднего человека, думающего в шестнадцатеричном числе. компьютеры не делают основы 10 (хорошо для ленивых людей, они раньше делали BCD), они действительно базируются 2. Десятичное число 1234 в компьютере действительно 0x4D2 или 0b010011010010. Это как значение, скажите, что Вы хотите добавить 1234 плюс некоторое другое число, Вам нужно то значение, которое не имеет никакого отношения к symbos 1, 2, 3, и 4. Но отправить этот ответ на stackoverflow мы не используем число, мы используем ASCII, таким образом 1234 в ASCII является 0x31, 0x32, 0x33, 0x34, который важен для знания для эйлерового решения, предполагающего, что 1 000 чисел цифры были обеспечены как строка ASCII, которой это должно будет быть, или необходимо было бы преобразовать его от двоичного файла до ASCII, так как проблемой является основа 10 проблем и не основа 2 по определению.

Таким образом, назад к тому, что я спросил. Скажите, что у Вас было 4 бита памяти для хранения числа, как большой из числа Вы могли сохранить? Если Вы думаете основа 10, только Вы могли бы думать, что число является 9, потому что Вы обучены думать об использовании самого большого символа в каждом месте хранения, 99999 самое большое количество, если у Вас есть 5 мест хранения в основе 10. Назад к четырем битам, хотя, самый большой символ для единственного бита равняется 1, помещает то число в каждое место хранения, Вы получаете 1111 (четыре). Только путем рассмотрения тех четырех необходимо смочь в уме, легко посмотрите восьмеричную и шестнадцатеричную версию того же самого восьмеричного номера 17 или шестнадцатеричное число F. Видеть десятичное число берет математику, или в этом запоминании случая, то число является 15 десятичными числами. Таким образом, самое большое количество на четыре бита, которое Вы можете иметь, является 0xF или 15 не 9. Что относительно числа на 8 битов? 0xFF или 255 (2 к 8-му питанию минус одно). Самое большое количество на 16 битов? 65535, и т.д.

Таким образом, когда я спрашиваю, сколько биты - Вы пытающийся использовать, это - то, что я имею в виду. Посмотрите на этот номер 99999. Снова базируйтесь 10, Вы думали бы, что это - самое большое количество, но к компьютеру это - только часть путь там, 99 999 десятичных чисел являются 0x1869F, который берет 17 битов памяти для хранения, самое большое количество на 17 битов, которое можно сохранить, является 0x1FFFF, который является 131071, который немного больше, чем 99 999. Таким образом, когда Вы хотите думать большие числа и математика на компьютере, необходимо думать двоичный файл (или шестнадцатеричное число).

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

Возьмите самый большой номер 1111 на 4 бита (двоичный файл), который является 15 десятичными числами. Добавьте, что с самым большим количеством на четыре бита и Вы добираетесь 15+15 = 30 = 0x1E или 11 110 двоичных файлов. Таким образом для добавления двух чисел на четыре бита Вам нужны пять битов для содержания ответа. Компьютеры сохраняют бит "переноса" для этого дополнительного бита. По существу добавить/вычесть целочисленные математические функции в компьютере позволяют Вам иметь биты N+1. Таким образом, если это - компьютер на 32 бита, у Вас в основном есть 33 бита для add/sub математики.

Проблема, умножаются и делятся, который не поддерживают даже сегодня много процессоров (да, многие не имеют никакого fpu и только добавляют и вычитают, иногда умножают, но деление редко. Умножьтесь и разделитесь, берут большую электронику, компромисс - Вы, может сделать их с, добавляет и вычитает в программном обеспечении). Возьмите худший случай, умножают для системы на четыре бита 1111 * 1111 = 11100001, таким образом, требуется 8 битов для хранения результата 4 битов, умножаются, Вы быстро найдете, что, если у Вас была система на 4 бита, большая часть умножения Вас хочет сделать, закончится число, которое не может быть сохранено в 4 битах. Таким образом, когда я видел, что Вы брали целые числа на 64 бита (неподписанными длинными длинными часто являются 64 бита), и умножение четыре раза, которое означает, что Вам нужно 64*5 или целое число на 320 битов для хранения ответа, Вы пытались поместить тот ответ в 64 больших результата, которые довольно часто, в зависимости от компилятора и компьютера счастливо сделают и усекут верхние биты, оставляя Вас с более низкими 64 битами результата, который может легко выглядеть меньшим, чем любой из Ваших операндов, который является тем, что я думал, что Вы, возможно, сделали сначала.

Плавающая точка не намного больше, чем экспоненциальное представление, но в двоичном файле, если бы Вы хотели умножить номер 1234 и 5678 с помощью экспоненциального представления, то Вы взяли бы 1.234*10^3 времена 5.678*10^3 и добрались бы 7.007*10^6. Вы сохраняете свою точность и можете представить более широкий диапазон чисел. Я, в которого входит привычка, как это работает в двоичном файле. Но это не работает на Ваш исходный вопрос.

Ahh, последняя вещь разъяснить то, что я делал в своем вопросе/ответе. Отрицательные целые числа в двоичном файле. Из-за отношений между дополнением и вычитанием и основными системами можно играть некоторые приемы. Скажите, что я хотел вычесть 1 из номера 7 (десятичное) использование двоичного файла. Хорошо нет такой вещи как вычитать схема, Вы вместо этого добавляете отрицательное число так вместо 7 - 1 это действительно 7 + (-1), это имеет значение:

0111 +???? = 0110

Какое число Вы могли добавить к 7 для получения 6... в двоичном файле?

0111 + 1111 = 0110

Отрицательные числа в двоичном файле называют "дополнением пар", длинная история закорачивают ответ, "инвертирование, и добавьте 1". Как Вы представляете минус 1 в двоичном файле? возьмите плюс один 0001 затем инвертирование, это означающий делает тех нулями и нулевыми (также известный как поразрядное дополнение до единицы), 1110 затем добавляет один 1111. Минус каждый - специальное число в компьютерах (хорошо везде) как, неважно, сколько битов у Вас есть оно, представлен как все. Таким образом, когда Вы видите, что кто-то делает это:

неподписанный символ a;

a =-1;

Компилятор сначала смотрит на это-1 и думает... 11111 (двоичный файл) затем это смотрит на, равняется знаку и другой стороне, о, Вы хотите быть всеми, это видит, что у Вас есть целое число со знаком и неподписанное, но преобразование должно просто переместить биты через то, таким образом, Вы говорите выше, что хотите = 0xFF; (принятие неподписанного символа на 8 битов).

Некоторые компиляторы могут жаловаться, что Вы пытаетесь сохранить отрицательное число в неподписанном числе. Другие компиляторы будут смотреть на это-1 и рассматривать его как 32 бита или в эти дни возможно, постоянное целое число со знаком на 64 бита и затем когда это оценит равняние в 8 битов, неподписанных, Вы получите предупреждение, что Вы не можете сохранить-1 в или неподписанном символе со знаком без преобразования типа. Но если Вы делаете это:

a = 0;-;

Всем компиляторам понравится это. и привычка жалуется, она просто записывает вычислительные циклы во времени выполнения вместо времени компиляции.

Теперь где-нибудь друг сказал мне о книге, которая делает двоичную математику последовательно. Например, для отрицания числа обычно Вы делаете инвертирование и рекламу один прием, но с карандашом и бумагой некоторые могут сказать Вам другой прием. Запуск с права копирует нули до и включая первый 1 затем инвертирование после этого, таким образом, минус 2

0010
1110

Запуск с права копирует 0 затем первый, затем инвертирует остающиеся биты, когда Вы идете оставленные.

минус 6

0110
1010

минус 4

0100
1100

Предположительно, существуют приемы, чтобы сделать, добавляют и вычитают (хорошо понятное дело, это легко), но также и умножьтесь и разделитесь. Если Вы делаете их последовательно затем, можно сделать бесконечно длинную математику в двоичном файле с тем же alu. Если бы необходимо было знать, как сделать это, Вы могли реализовать это в программном обеспечении, и Ваш исходный вопрос умножения больших констант (с предположением о сохранении всей точности) тривиален на любом компьютере.

3
ответ дан 18 December 2019 в 05:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: