Floating-Point Numbers
Здравейте,
Преговарям математиката от 5-ти клас нататък във връзка с малкото, което знам за програмирането дотук. Реших да напиша с код някои от задачите, които срещам в сборника си. Въпросът ми, свързан с кода от линка по-долу, е за числата с плаваща запетая. Както ще видите, всички числа, които съм предвидила, са double, а в коментари описвам какво и защо правя. В даден момент искам да превърна няколко double в цели числа, за да мога на финала програмата да сравни 4 дроби. За целта умножавам по най-голямото кратно на 10, което компилаторът понася за double.
Правих тестове с няколко различни по големина числа, и очаквах заради числа с по 15-20 знака преди десетичната запетая и още толкова след нея, програмата да гърми, но не се случва нищо подобно.
Понеже имам твърде малко опит в писането на код, интересно ми е дали правилно очаквам:
1. програмата ми да гръмне, като й въведа 35465769973969799743.836849374034083094830948687, при положение, че потребителят е поканен да въведе double
2. пак да гръмне, като поискам да събере или умножи особено горното с нещо подобно на него, заради прехвърлен обхват
3. да гръмне, като поискам сборa или произведението на две такива числа да бъдат умножени с някакво много голямо число, кратно на десет, пак заради обхвата.
Ако очакванията ми са оправдани, то защо програмата не гърми, а изчислява? Нямам пълно доверие в резултатите, когато числата са необозримо големи, иначе с по-поносими числа, работи или поне така ми се струва.
Бих била благодарна и на всякакви коментари изобщо по добрите практики за писане, на базата на това, което виждате тук.
https://github.com/NellyIfandieva/First-Code-Trials/tree/master
Но нали double работи коректно с до 15 знака? Колко голямо число ще го накара да излезе от обхват?
Да, така е, може да очакваш точност до 15 знака (правилно изчисление, без грешка в резултата), но това не пречи да смяташ много по - големи числа, където тези отклонения/грешки не са от толкова голямо значение, а по - важното е да имаш възможност да направиш самото изчисление.
Ако примениш типа на decimal, float... и т.н. ще започнеш да виждаш exeptions или стойности като безкрайности т.н... :)
А какво число би го накрало... ами по голямо от 1.7 * (10 на степен 305)
Да, всъщност, разбира се, че ще излезе от обхват, когато въведа или достигна число, по-голямо от 1.7е305.
Остана само да схвана как така "... отклоненията/грешките не са от толкова голямо значение". Но това може би ще трябва да стане на някоя лекция.
Благодаря, Tanyo.