Ако не ме разбираш повярвай ми на честна дума, или някой друг дето по-добре от мен обяснява да ти каже. Ще направя последен опит да ти обясня.
В отговор на:
Няма шанс да стане голяма грешка - иначе нямаше да седя и да споря сега :)
Приказваш наизуст. Голяма (относителна) грешка при FP-числата става при 'истинско изваждане' ( както го нарича Шишков ) на числа с близки стойности, а не при събиране. Иначе ето ти голяма грешка от общ характер:
n=3; Arr[0] = MAX_INT; Arr[1] = -MAX_INT-1; Arr[2] = 0;
Сумата е -1 и средното е -1/3. По твоя метод се получава грешка още в 6-7 цифра. Само 3 елемента :-)
В отговор на:
Между другото, твърде малко хора наистина разбират какво става в един double, макар че повечето добре знаят за мантиси и експоненти.
Аз съм точно от тези хора и ако не бях не бих спорил(-:цитат:-). Не знам ти от къде вадиш изводите си, но аз тия неща съм ги учил, държал съм изпити на тях, решавал съм задачи на лист. Освен това съм писал клас, който още пазя, за сумиране на FP-числа с минимална грешка. А с бройните системи съм на ти, няма смисъл да ми обясняваш за приликите м/у умножение по 10 в десетична и по 2 в двоична.
В отговор на:
При същото положение, обаче, сумирането на целочислените в double ще го препълни много бързо.
Тук е видно, че ти не си от тия които наистина разбират от мантиси и порядъци ( по-правилно е характеристики, но не е популярно ).
Препълването при типове с плаваща запетая хич не прилича на препълването при целите числа. Тук просто започваш да губиш от младшите цифри. Ако ти е достатъчно голямо числото и добавяш към него малки числа то те няма да го увеличат. Затова ми се е налагало да пиша суматор, който прави така, че да се сумират само числа с близки порядъци. Когато работиш с цели числа имаш възможно най-късото представяне - 31 бита ( знакът на мантисата си е отделно, не е като при целите числа ). С изместването на диапазона не печелиш абсолютно нищо - препълването не зависи от абсолютната стойност на порядъка ( поне в случая ), а от съотношението м/у порядъците на натрупаното число и новодобавеното. Само правиш числата по-неточни и по-рано ще започнеш да губиш битове информация. Няма такава редица от числа, за която твоят цикъл ще даде по-верен резултат от моя. И двата ще се напълнят след няколко милиона MAX_INT-а и ще престанат да добавят малките числа. Разликата е, че ти ще започнеш да губиш значещи цифри значително по-рано, защото всичките битове са важни за числото ти. За мен са важни само 31. Т.е. при големи масиви при мен все още ще се получава точен отговор, а при теб няма да има много общо с действителността. За съжаление нямам C++ вкъщи и не мога да ти дам пример. Жабата отказва да направи масив с повече от 100К елементи.
А за 'бавно' не бери грижа. Те съвременните процесори правят толкова много неща наведнъж, че нищо чудно да е със същата скорост. Това не е съществено. Същественото беше 'по-точно'.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
|