25.07.2017 Views

Intro-CSharp-Book-v2015

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

290 Въведение в програмирането със C#<br />

1.00000012<br />

Причината за това отново е закръглянето.<br />

Ако направим разследване защо се получават тези резултати, ще се<br />

убедим, че числото 0.1 се представя в типа float по следния начин:<br />

Бит 31<br />

Битове (30-23)<br />

Битове (22-0)<br />

0 01111011 10011001100110011001101<br />

Знак = 1<br />

Порядък = -4<br />

Мантиса ≈ 1,6<br />

Всичко изглежда коректно с изключение на мантисата, която има стойност,<br />

малко по-голяма от 1.6, а не точно 1.6, защото това число не може да се<br />

представи като сума от отрицателни степени на 2. Ако трябва да сме съвсем<br />

точни, стойността на мантисата е 1 + 1 / 2 + 1 / 16 + 1 / 32 + 1 / 256 + 1 /<br />

512 + 1 / 4096 + 1 / 8192 + 1 / 65536 + 1 / 131072 + 1 / 1048576 + 1 /<br />

2097152 + 1 / 8388608 ≈ 1,60000002384185791015625 ≈ 1.6. Така числото<br />

0.1 в крайна сметка се представя във формат IEE 754 като съвсем малко<br />

повече от 1.6 × 2 -4 и грешката настъпва не при събирането, а още преди<br />

това – при записването на 0.1 в типа float.<br />

Типовете double и float имат поле Epsilon, което е константа и съдържа<br />

най-малката стойност по-голяма от 0, която съответно System.Single или<br />

System.Double инстанцията може да представи. Всяка стойност по-малка от<br />

Epsilon се счита за равна на 0. Така например, ако сравняваме две числа,<br />

които са все пак различни, но тяхната разлика е по-малка от Epsilon, то те<br />

ще бъдат сметнати за равни.<br />

Типът decimal<br />

Типът System.Decimal в .NET Framework използва десетична аритметика<br />

с плаваща запетая (decimal floating-point arithmetic) и 128-битова<br />

точност, която е подходяща за големи и прецизни финансови изчисления.<br />

Ето и някои характеристики на типа decimal:<br />

Тип Размер Обхват<br />

Значещи<br />

цифри<br />

Тип в .NET<br />

framework<br />

decimal<br />

128 бита<br />

±1.0 × 10 −28 ÷<br />

±7.9 × 10 28<br />

28-29 System.Decimal<br />

За разлика от числата с плаваща запетая, типът decimal запазва точност за<br />

всички десетични числа, които са му в обхвата. Тайната за тази отлична<br />

точност при работа с десетични числа се крие във факта, че вътрешното<br />

представяне на мантисата не е в двоична бройна система, а в

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

Saved successfully!

Ooh no, something went wrong!