Форум программистов, компьютерный форум CyberForum.ru

Не вмещается число - C++

Восстановить пароль Регистрация
 
faradej
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 67
25.04.2013, 13:30     Не вмещается число #1
Начал изучать с++ по учебнику, и вот есть такая практическая задачка, нужно первый пример переделать с использованием array вместо масива, вместо long long использовать long double, и расчитать не 16 значений а 100. 1 код это то с чего надо переделать, а 2-й это то что я максимум смог сделать. В итоге происходит переполнение и не представляю что можно тут сделать.
// formore.cpp -- more looping with for
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
const int ArSize = 16;      // example of external declaration
int main()
{
    long long factorials[ArSize];
    factorials[1] = factorials[0] = 1LL;
    for (int i = 2; i < ArSize; i++)
        factorials[i] = i * factorials[i-1];
    for (int i = 0; i < ArSize; i++)
        std::cout << i << "! = " << factorials[i] << std::endl;
    // std::cin.get();
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    array <long double, 100> counter;
    counter[1] = counter[0] = 0.1e1;
    for (int i = 2; i < 100; i++)
        counter[i] = i * counter[i-1];
    for (int i = 0; i < 100; i++)
        std::cout << i << "! = " << counter[i] << std::endl;
    // std::cin.get();
    system ("pause");
    return 0; 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2013, 13:30     Не вмещается число
Посмотрите здесь:

Задача число и число записанное в обратном направлении сумма целого числа C++
Дано действитёльное число х. Получить целую часть *) числа х; затем — число х, округленное до ближайшего целого; затем — число х без дробных цифр. C++
Дано 2-ух-значное число. Сделать так, чтоб программа преобразовала это число в новое число кол-во десятков C++
C++ Дано натуральное четырехзначное число n. Определить, является ли это число перевертышем
Некоторое число оканчивается на 2. Если же эту его последнюю цифру переставить на первое место, то число удвоится. Найти это число C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.04.2013, 13:55     Не вмещается число #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <array>
 
int main()
{
   std::array<long double, 100> facs;
 
   facs[1] = facs[0] = 1;
 
   for( int i=2; i<facs.size(); ++i )
   {
      facs[i] = i * facs[i-1];
      std::cout << i << "! = " << facs[i] << std::endl;
   }
 
   system( "pause" );
   return 0;
}
faradej
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 67
25.04.2013, 14:24  [ТС]     Не вмещается число #3
Ну ваш код практически идентичен моему, по крайней мере по результату, до 9 значения числа нормальные, а потом идет переполнение.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.04.2013, 14:35     Не вмещается число #4
faradej, о каком переполнении Вы говорите?
У меня например:
C++
1
std::numeric_limits<long double>::max()
1.79769e+308
При этом 99! = 9.33262e+155
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
25.04.2013, 14:36     Не вмещается число #5
Нет никакого переполнения:
Кликните здесь для просмотра всего текста
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = 51090942171709440000
22! = 1124000727777607680000
23! = 25852016738884976640000
24! = 620448401733239439360000
25! = 15511210043330985984000000
26! = 403291461126605635592388608
27! = 10888869450418352161430700032
28! = 304888344611713860511469666304
29! = 8841761993739701954695181369344
30! = 265252859812191058647452510846976
31! = 8222838654177922818071027836256256
32! = 263130836933693530178272890760200192
33! = 8683317618811886496153221372728836096
34! = 295232799039604140861139076140532498432
35! = 10333147966386144929973846968255251480576
36! = 371993326789901217462530208167145295052800
37! = 13763753091226345045735828383554804299857920
38! = 523022617466601111725872220378936271647539200
39! = 20397882081197443356844789080046496991166857216
40! = 815915283247897734263888042887576837447481294848
41! = 33452526613163807104423268945819328647379013337088
42! = 1405006117752879898385777295724411803189918560157696
43! = 60415263063373835632129886846027234489386489184518144
44! = 2658271574788448767730638271488641075476517582851276800
45! = 119622220865480194551201792206451138078702808879008317440
46! = 5502622159812088949397817737361869659553251034363353628672
47! = 258623241511168180613530656849905350875881808036715183472640
48! = 12413915592536072669101022385068415855455831187752198158155776
49! = 608281864034267560801281859192342180327141534512303458284994560
50! = 30414093201713378039796484017234741538658648106343392576177963008
51! = 1551118753287382279992512244868616861564075618217826147839124701184
52! = 80658175170943878558514510505169899612679168522789747422892535054336
53! = 4274883284060025563735727207408447747946734936317754651221650151833600
54! = 230843697339241380440980980361742756095003399926808014259905270737010688
55! = 12696403353658275924301844405547910612048885340572887946282875488103825408
56! = 710998587804863451748643322383755883407870802854879251522891114356345405440
57! = 40526919504877216748740912087027624928366760770220729353164600132024057987072
58! = 2350561331282878571452081307989148968900615282365632968147956229435251501301760
59! = 138683118545689835712659788338374182398495122736432665241000286923337102010613760
60! = 8320987112741390142708165282886163255092364577231042711179306719599176749907181568
61! = 507580213877224798710957348206680179708176631350044332149377285425267311266058207232
62! = 31469973260387937519974043297145613955209033116019078160942496600966024187241297870848
63! = 1982608315404440063721294801052841549460501940564549931963126212279866236634684301770752
64! = 126886932185884164078162867267381859165472124196131195645640077585911439144619795313328128
65! = 8247650592082470665115095104113773664692861852059912844228860587945095477176099316485324800
66! = 544344939077443063904663665130622599188062072238925921782414734391878777326108979693201915904
67! = 36471110918188685280142448805856098383386855319389928554253320602055363107692125279969068711936
68! = 2480035542436830599151004596880866361065930773601117061060837037522200184857589905044820660846592
69! = 171122452428141311337482386150711028269147809888181688346186576110400033577832145591823579190657024
70! = 11978571669969891793327339282102242518556004970550477140128689166983962506507238776367392931467755520
71! = 850478588567862317347109602519965292821494010111289646454084660572241742975461156742327034010438467584
72! = 61234458376886086849963225827550365618607299681424613998015298980727475254859109490316998591354173915136
73! = 4470115461512684340043430147626725232016493952930349784041832011915001414562211367973663088598444278808576
74! = 330788544151938641156748628851050440821200583290937213097789638921344584350877609530439995095121942749904896
75! = 24809140811395398087201748783651951892961266241159842455064231630215267381142476438079270541457375610720485376
76! = 1885494701666050254578444044125520677794613537806322950719646362448377850951560838509519409956440465466355351552
77! = 145183092028285869606060189564771084147257116560658272667709707292779832364369435261717365452636961669194272735232
78! = 11324281178206297829489630969387861993729299483764190404720694346888674471368562363708398696205279316058860360302592
79! = 894618213078297528506184989186511086598269420449505968712305103658282102768698969046919080016630019918397385507602432
80! = 71569457046263802279401173772529380965675302522401666814307823577215962003283032220548549901730713631860034252096667648
81! = 5797126020747367984701487098767936239799619575582298895650235131543075720231550269269551038014567833723815196084567801856
82! = 475364333701284174745521942098970771663568805197748509443319280786532209058987122080103185117194562365352846078934559752192
83! = 39455239697206586503018259213218297231222152995674843680996788434344067930494335317878468286193966873298029267135271326973952
84! = 3314240134565353266271881762838257539515547418799103564730102748398247955151424877416886719049001095821594606864243796958248960
85! = 281710411438055027625770754270083662021666903732957124791509725648512576591910830294397217915681941759011482213508320544476364800
86! = 24227095383672732374952021196766424306000024861415836705995585227773819874484048327794307819506471084080346238956120684109215301632
87! = 2107757298379527716618420936513918509396643334812065512305583215886240209532507938563255798255345625268883295014836496365597029826560
88! = 185482642257398439068577605881411466203823213479109204739935032258999364480727619437979904273266854181695209063631379749048574248222720
89! = 16507955160908461077398921969918579086232358800391796325392315915579434288794370330512054393606979101756480603574829664971372818019123200
90! = 1485715964481761497003728903241210817804700170531399538538184982101795914792723691414160788325265441345040949926424188862597916492415631360
91! = 135200152767840296225564033403765434764839271087605287343373160638693337081066777611066936497462576841090845262924506427384226970078558552064
92! = 12438414054641307252173467100454952474282287045531011775740476681166040944584075844353053090434784641783317205054303717077706570725331948273664
93! = 1156772507081641574421723865777959144556464591064876627311757715932084871759225208942211271013564649777889796389823342585237515324304796707454976
94! = 108736615665674307993780509775014819533659078052678119719148437710388562031861598633075132767153624329277908044045155960881509587422185113515982848
95! = 10329978488239059259170872126787900328702592446054625117555032771321804156098138781183068594240048359301403463659715321290998853613111966329965903872
96! = 991677934870949688836041009065705393802194247874954672030300152840880133782693649703740644122154632524295142013666437594377630571476291618413140246528
97! = 96192759682482119815853821856407298141721712489374501687799591015797007151244909169147492133952079075734720241390989915666998902922491486806694181208064
98! = 9426890448883247741635682600048587203273398658007699181624641824247405049448849136434924540577692157966793998969045451802532289283662712861134641545871360
99! = 933262154439441526380502770119960540362755010093145960522681983041315970459391123153761090094727842009119716007250976491487232907525436431040857220210229248
faradej
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 67
25.04.2013, 22:42  [ТС]     Не вмещается число #6
1.79769e+308 . У меня просто такой формат был, а я его не встречал раньше, поэтому решил спросить чтоб не было что забил. Спасибо.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.04.2013, 22:46     Не вмещается число #7
На самом деле переполнения хоть и нет, но есть потеря точности. Может быть lazybiz расскажет как длинные инты выводил
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
25.04.2013, 22:57     Не вмещается число #8
Тут нет никакого секрета:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <iomanip>
#include <array>
 
int main()
{
    std::array < long double, 100 > facs;
    facs[1] = facs[0] = 1;
    for ( size_t i = 2; i < facs.size(); i++ ) {
        facs[i] = i * facs[i - 1];
        std::cout << i << "! = " << std::setprecision( 500 ) << facs[i] << std::endl;
    }
    return 0;
}


Добавлено через 4 минуты
Кстати, сегодня для себя внезапно узнал что long double, размером 12 байт, вмещает в себя 4933 знака.
Кликните здесь для просмотра всего текста
C++
1
    std::cout << std::setprecision( 5000 ) << std::numeric_limits< long double >::max();
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.04.2013, 23:10     Не вмещается число #9
Может все же std::fixed вместо std::setprecision?

Цитата Сообщение от lazybiz Посмотреть сообщение
Кстати, сегодня для себя внезапно узнал что long double, размером 12 байт, вмещает в себя 4933 знака.
12 байт? Он же вроде 80 бит везде. Ну, за счет выравнивания чуть больше, но то выравнивание, а не реальный размер.
К тому же, после 15-16 десятичных знаков он начинает хранить значения неточно.

Т.е. если нужно точное значение, а не приблизительное, то стоит использовать unsigned long long (в него влезает больше цифр).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2013, 23:14     Не вмещается число
Еще ссылки по теме:

C++ Заменить данное натуральное число на число, которое получается из исходного записью его цифр в обратном порядке. Например, дано число 156, нужно получ
C++ Не получается исправить ошибку (Вводится диапазон, где 1-ое число-начало диапазона, 2-ое число приращени, 3-е число конец диапазона)
Введенное число делить на второе введенное число пока первое число не станет равным нулю C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.04.2013, 23:14     Не вмещается число #10
lazybiz, что-то выхлоп совсем не такой получается по Вашему коду.

Добавлено через 2 минуты
Цитата Сообщение от diagon Посмотреть сообщение
если нужно точное значение, а не приблизительное
именно поэтому сработает например условие:
C++
1
2
3
4
if( (facs[99] + 100 ) == facs[99] )
{
   std::cout << "equal" << std::endl;
}
Yandex
Объявления
25.04.2013, 23:14     Не вмещается число
Ответ Создать тему
Опции темы

Текущее время: 14:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru