25.07.2017 Views

Intro-CSharp-Book-v2015

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 />

запетая зависи от следните параметри:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!