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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
faradej
0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 67
#1

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

25.04.2013, 13:30. Просмотров 333. Ответов 9
Метки нет (Все метки)

Начал изучать с++ по учебнику, и вот есть такая практическая задачка, нужно первый пример переделать с использованием 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     Не вмещается число
Посмотрите здесь:

Программа задумывает число от 1 до 10, и предлагает пользователю отгадать число за 5 попыток C++
Задача число и число записанное в обратном направлении сумма целого числа C++
C++ Ввести число с клавиатуры, потом записать это число в текстовой файл
Как из 4-х байт, составляющих число типа double, получить это число? C++
Дано 2-ух-значное число. Сделать так, чтоб программа преобразовала это число в новое число кол-во десятков C++
Вводится число от 1 до 15. Вывести данное число, записанное римскими цифрами C++
C++ Не получается исправить ошибку (Вводится диапазон, где 1-ое число-начало диапазона, 2-ое число приращени, 3-е число конец диапазона)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4391 / 3234 / 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
:)
Эксперт С++
4391 / 3234 / 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
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 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
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.04.2013, 22:46     Не вмещается число #7
На самом деле переполнения хоть и нет, но есть потеря точности. Может быть lazybiz расскажет как длинные инты выводил
castaway
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 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
1924 / 1190 / 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++
Напечатать таблицу умножения на заданное число (число вводится с клавиатуры) C++
C++ Ввести число n, разбить число на цифры, и найти сумму этих цифр
Функция определяющая что общее число книг есть шестизначное число C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4391 / 3234 / 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     Не вмещается число
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru