Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 25.04.2013
Сообщений: 67
1

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

25.04.2013, 13:30. Просмотров 524. Ответов 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; 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2013, 13:30
Ответы с готовыми решениями:

Вмещается ли текст
Добрый день. У меня есть блок с фиксированной шириной 600 и с максимальной высотой 1000. В него...

Прошивка не вмещается на дискету
При попытке установки Win с флешки оказалось, что нет возможности загружаться с оной. Материнка -...

Приложение не вмещается в экран
Здравствуйте.Написал калькулятор, тестировал на виртуалке(когда код писал), решил проверить на...

Узнать, что текст не вмещается в Label
Ребят, подскажите, пожалуйста, как узнать что текст не вмещается в максимальные установленные...

9
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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;
}
0
0 / 0 / 1
Регистрация: 25.04.2013
Сообщений: 67
25.04.2013, 14:24  [ТС] 3
Ну ваш код практически идентичен моему, по крайней мере по результату, до 9 значения числа нормальные, а потом идет переполнение.
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.04.2013, 14:35 4
faradej, о каком переполнении Вы говорите?
У меня например:
C++
1
std::numeric_limits<long double>::max()
1.79769e+308
При этом 99! = 9.33262e+155
1
Эксперт С++
4958 / 3064 / 456
Регистрация: 10.11.2010
Сообщений: 11,152
Записей в блоге: 10
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! = 124139155925360726691010223850684158554558311877521981581557 76
49! = 608281864034267560801281859192342180327141534512303458284994 560
50! = 304140932017133780397964840172347415386586481063433925761779 63008
51! = 155111875328738227999251224486861686156407561821782614783912 4701184
52! = 806581751709438785585145105051698996126791685227897474228925 35054336
53! = 427488328406002556373572720740844774794673493631775465122165 0151833600
54! = 230843697339241380440980980361742756095003399926808014259905 270737010688
55! = 126964033536582759243018444055479106120488853405728879462828 75488103825408
56! = 710998587804863451748643322383755883407870802854879251522891 114356345405440
57! = 405269195048772167487409120870276249283667607702207293531646 00132024057987072
58! = 235056133128287857145208130798914896890061528236563296814795 6229435251501301760
59! = 138683118545689835712659788338374182398495122736432665241000 286923337102010613760
60! = 832098711274139014270816528288616325509236457723104271117930 6719599176749907181568
61! = 507580213877224798710957348206680179708176631350044332149377 285425267311266058207232
62! = 314699732603879375199740432971456139552090331160190781609424 96600966024187241297870848
63! = 198260831540444006372129480105284154946050194056454993196312 6212279866236634684301770752
64! = 126886932185884164078162867267381859165472124196131195645640 077585911439144619795313328128
65! = 824765059208247066511509510411377366469286185205991284422886 0587945095477176099316485324800
66! = 544344939077443063904663665130622599188062072238925921782414 734391878777326108979693201915904
67! = 364711109181886852801424488058560983833868553193899285542533 20602055363107692125279969068711936
68! = 248003554243683059915100459688086636106593077360111706106083 7037522200184857589905044820660846592
69! = 171122452428141311337482386150711028269147809888181688346186 576110400033577832145591823579190657024
70! = 119785716699698917933273392821022425185560049705504771401286 89166983962506507238776367392931467755520
71! = 850478588567862317347109602519965292821494010111289646454084 660572241742975461156742327034010438467584
72! = 612344583768860868499632258275503656186072996814246139980152 98980727475254859109490316998591354173915136
73! = 447011546151268434004343014762672523201649395293034978404183 2011915001414562211367973663088598444278808576
74! = 330788544151938641156748628851050440821200583290937213097789 638921344584350877609530439995095121942749904896
75! = 248091408113953980872017487836519518929612662411598424550642 31630215267381142476438079270541457375610720485376
76! = 188549470166605025457844404412552067779461353780632295071964 6362448377850951560838509519409956440465466355351552
77! = 145183092028285869606060189564771084147257116560658272667709 707292779832364369435261717365452636961669194272735232
78! = 113242811782062978294896309693878619937292994837641904047206 94346888674471368562363708398696205279316058860360302592
79! = 894618213078297528506184989186511086598269420449505968712305 103658282102768698969046919080016630019918397385507602432
80! = 715694570462638022794011737725293809656753025224016668143078 23577215962003283032220548549901730713631860034252096667648
81! = 579712602074736798470148709876793623979961957558229889565023 513154307572023155026926955103801456783372381519608456780185 6
82! = 475364333701284174745521942098970771663568805197748509443319 280786532209058987122080103185117194562365352846078934559752 192
83! = 394552396972065865030182592132182972312221529956748436809967 884343440679304943353178784682861939668732980292671352713269 73952
84! = 331424013456535326627188176283825753951554741879910356473010 274839824795515142487741688671904900109582159460686424379695 8248960
85! = 281710411438055027625770754270083662021666903732957124791509 725648512576591910830294397217915681941759011482213508320544 476364800
86! = 242270953836727323749520211967664243060000248614158367059955 852277738198744840483277943078195064710840803462389561206841 09215301632
87! = 210775729837952771661842093651391850939664333481206551230558 321588624020953250793856325579825534562526888329501483649636 5597029826560
88! = 185482642257398439068577605881411466203823213479109204739935 032258999364480727619437979904273266854181695209063631379749 048574248222720
89! = 165079551609084610773989219699185790862323588003917963253923 159155794342887943703305120543936069791017564806035748296649 71372818019123200
90! = 148571596448176149700372890324121081780470017053139953853818 498210179591479272369141416078832526544134504094992642418886 2597916492415631360
91! = 135200152767840296225564033403765434764839271087605287343373 160638693337081066777611066936497462576841090845262924506427 384226970078558552064
92! = 124384140546413072521734671004549524742822870455310117757404 766811660409445840758443530530904347846417833172050543037170 77706570725331948273664
93! = 115677250708164157442172386577795914455646459106487662731175 771593208487175922520894221127101356464977788979638982334258 5237515324304796707454976
94! = 108736615665674307993780509775014819533659078052678119719148 437710388562031861598633075132767153624329277908044045155960 881509587422185113515982848
95! = 103299784882390592591708721267879003287025924460546251175550 327713218041560981387811830685942400483593014034636597153212 90998853613111966329965903872
96! = 991677934870949688836041009065705393802194247874954672030300 152840880133782693649703740644122154632524295142013666437594 377630571476291618413140246528
97! = 961927596824821198158538218564072981417217124893745016877995 910157970071512449091691474921339520790757347202413909899156 66998902922491486806694181208064
98! = 942689044888324774163568260004858720327339865800769918162464 182424740504944884913643492454057769215796679399896904545180 2532289283662712861134641545871360
99! = 933262154439441526380502770119960540362755010093145960522681 983041315970459391123153761090094727842009119716007250976491 487232907525436431040857220210229248
0
0 / 0 / 1
Регистрация: 25.04.2013
Сообщений: 67
25.04.2013, 22:42  [ТС] 6
1.79769e+308 . У меня просто такой формат был, а я его не встречал раньше, поэтому решил спросить чтоб не было что забил. Спасибо.
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.04.2013, 22:46 7
На самом деле переполнения хоть и нет, но есть потеря точности. Может быть lazybiz расскажет как длинные инты выводил
0
Эксперт С++
4958 / 3064 / 456
Регистрация: 10.11.2010
Сообщений: 11,152
Записей в блоге: 10
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();
0
Higher
1944 / 1210 / 120
Регистрация: 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 (в него влезает больше цифр).
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2013, 23:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Текст items не вмещается полностью в combobox
Подскажите как Сделать так чтобы текст занесенный в Combobox отображался полностью.

Обрезать надпись в QLabel, если она не вмещается
Привет. Мне нужно задать фиксированный размер лейбл. Вот у меня сейчас так: задан максимальный...

Как отобразить весь текст в combobox, если он не вмещается
Какие могут быть варианты?

Как распечатать ту часть графика, которая не вмещается в обзор
Здравствуйте. Пишу программку для построения календарных графиков. Столкнулся с проблемой их...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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