Чтобы объяснить комментарий Петерта:
const int N=45;
long int toc;
toc = pow(2, N) - 1;
vector<long double > E(toc);
Здесь toc
составляет около 2 45 , что на самом деле огромное число, что-то выше 30e12, то есть 3 раза 10 13 (потому что 2 10 чуть больше тысячи, а 2 5 - больше 30, и вы можете вычислить это в своей голове, без какого-либо устройства или бумаги).
У вас недостаточно ресурсов для того, чтобы хранить столько цифр на вашем компьютере (long double
занимает от 8 до 12 байт каждый), даже если каким-то чудом Гарри Поттера вы получили такой гигантский компьютер, так как заполняяlong double
число может занять одну или несколько наносекунд, вам потребуется как минимум много часов (поскольку 30e12 наносекунд - это 30000 секунд, например, более 8 часов) процессорного времени, чтобы заполнить такую гигантскую память (по крайней мере, 8 * 30e12)байт, например, 240 терабайт оперативной памяти; более 1000 евро за 128 Гбайт DRAM4 потребительского уровня, что будет означать 200 тыс. евро для 2000 модулей DDR4 SDRAM - ни одна материнская плата не справится с такой нагрузкой!).Помните о пределах вычислений и проблемах с вычислениями .
При кодировании учитывайте фактическую емкость вашего типичного компьютера и сделайте приблизительную оценку ресурсов(в памяти, на диске, во времени), необходимый вашей программе.Первые практические правила: ваш ноутбук или настольный компьютер имеют менее 128 ГБ ОЗУ (если вы не заплатили за это много; обычный высокопроизводительный ноутбук имеет 16 или 32 ГБ в 2018 году; с 3000 € до 5000 €Я мог бы купить в 2019 году настольный компьютер с 128 ГБ ОЗУ и 10 Терабайт SSD или диска), он имеет менее нескольких терабайт диска;он выполняет от 3 до 20 «элементарных операций» (я оставляю вас догадываться, какими могут быть эти машинные коды инструкции) каждую наносекунду.Весь день длится 86400 секунд (вы можете округлить его до 1e5).См. http://norvig.com/21-days.html для полезного понимания.Год - 31e6 секунд, век - более 3 миллиардов (3.1e9) секунд.
Для суперкомпьютеров вам нужно много платить за них (или получить какой-то исследовательский грант для доступа к ним).Просмотрите список TOP500 , чтобы получить представление об их возможностях.Сегодня это высокопараллельные компьютеры, и параллельные вычисления - сложный вопрос.
Когда вы что-то кодируете, вы должны сделать обоснованное предположение о ресурсах, необходимых для вашей программы.Таким образом, понимание сложности времени и других видов сложности вычислений (в частности сложность пространства ) на практике необходимо для кодирования (вам следует избегать комбинаторного взрыва ).Некоторые проблемы неразрешимы , другие неразрешимы (читайте о теории сложности вычислений , узнайте о проблеме коммивояжера ).Вы должны спросить себя, подходит ли ваша проблема (или ваш предполагаемый алгоритм) в такие области.