Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
288 Въведение в програмирането със C#<br />
NaN<br />
Ако изпълним горния код с тип int вместо double, ще получим<br />
System.DivideByZeroException, защото целочисленото деление на 0 е<br />
непозволена операция.<br />
Грешки при числата с плаваща запетая<br />
Числата с плаваща запетая (представени съгласно стандарта IEEE 754) са<br />
удобни за работа с изчисления от физиката, където се използват много<br />
големи числа (с няколко стотици цифри) и много близки до нулата числа<br />
(със стотици цифри след десетичната запетая преди първата значеща<br />
цифра). При такива числа форматът IEEE 754 е изключително удобен,<br />
защото запазва порядъка на числото в експонентата, а мантисата се<br />
ползва само за съхранение на значещите цифри. При 64-битови числа с<br />
плаваща запетая се постига точност до 15-16 цифри и експонента<br />
отместваща десетичната точка над 300 позиции наляво и надясно.<br />
За съжаление не всяко реално число има точно представяне във<br />
формат IEEE 754, тъй като не всяко число може да се представи като<br />
полином на ограничен брой събираеми, които са отрицателни степени на<br />
двойката. Това важи с пълна сила дори за числата, които употребяваме<br />
ежедневно при най-простите финансови изчисления. Например числото 0.1<br />
записано като 32-битова floating-point стойност се представя като<br />
0.099999994. Ако се ползва подходящо закръгляне, числото се възприема<br />
като 0.1, но грешката може да се натрупа и да даде сериозни отклонения,<br />
особено при финансови изчисления. Например, при сумиране на 1000<br />
артикула с единична цена от по 0.1 EUR би трябвало да се получи сума 100<br />
EUR, но ако смятаме с 32-битови floating-point числа, ще получим сумата<br />
99.99905. Ето реален пример на C# в действие, който доказва грешките,<br />
причинени от неточното представяне на десетичните реални числа в<br />
двоична бройна система:<br />
float sum = 0f;<br />
for (int i = 0; i < 1000; i++)<br />
{<br />
sum += 0.1f;<br />
}<br />
Console.WriteLine("Sum = {0}", sum);<br />
// Sum = 99.99905<br />
Можете сами да се убедите в грешките при подобни пресмятания, като<br />
изпълните примера или си поиграете с него и го модифицирате, за да<br />
получите още по-фрапантни грешки.<br />
Точност на числата с плаваща запетая<br />
Точността на резултатите от изчисленията при работа с числа с плаваща<br />
запетая зависи от следните параметри: