експонента: -5 — 5 мантиса: 0.00 — 9.99
440 = 4.40 x 102
0.7 = 7.00 x 10-1
4210 = 4.21 x 103
0.0101 = 1.01 x 10-2
123000 = 1.23 x 105
0.00143 = 1.43 x 10-3
123001 няма представяне
0.00000012 няма представяне
4210 + 0.0101 няма представяне
...въпреки че двете по отделно имат
...ще трябва върне 4210 или 4420
Float-овете имат NaN
(Not a Number)
0.0 / 0.0 връща* NaN
NaN == NaN връща false
Slide 141
Slide 141 text
Float-а дори не е асоциативен:
a = 1234.567
b = 45.67844
c = 0.0004
(a + b) + c != a + (b + c)
Slide 142
Slide 142 text
Ако ползвате float за пари:
- 0.25, 0.50, 0.75
- имате грешки
- имате +∞ и -∞ пари
- имате отрицателни нули
- имате NaN
Slide 143
Slide 143 text
Float има нишови приложения.
Например графика.
Slide 144
Slide 144 text
BigDecimal
Slide 145
Slide 145 text
pi = BigDecimal(“3.14”)
e = BigDecimal(“2.71”)
pi_times_e = pi * e
Slide 146
Slide 146 text
Пази числата като текстов низ,
съдържащ десетична дроб.
Буквално.
Slide 147
Slide 147 text
3.14 се пази като “3.14”
Slide 148
Slide 148 text
Този формат също пази само
рационални числа
(крайни десетични дроби)
Slide 149
Slide 149 text
Операциите са доста по-бавни
Slide 150
Slide 150 text
Събиране, изваждане и умножение
са точни и съответно подходящи
за пазене на парични суми
Slide 151
Slide 151 text
?
Slide 152
Slide 152 text
а дано, ама надали
Slide 153
Slide 153 text
Делението на BigDecimal числа
може да загуби точност
Slide 154
Slide 154 text
x = 1.0 / 3.0 // 0.33333
x * 3.0 // 0.99999
Slide 155
Slide 155 text
За щастие, при работата с пари
делението играе роля по-рядко
Slide 156
Slide 156 text
Eдин пример
Slide 157
Slide 157 text
- система за залози на мачове
- всеки влиза в системата с Х пари
- може да заложи Y пари за мач
- цялата сума се разделя
пропорционално между позналите
- парите в системата са константа
Slide 158
Slide 158 text
Име Сума Залог
Васил 10 1
Кирил 30 2
Радо 20 1
Андрей 20 3
Стефан 10 1
Веселин 10 3
Радо, Стефан и Васил печелят
Общата сума е 100 лв
Радо взема 50 лв
Васил и Стефан вземат по 25 лв
Slide 159
Slide 159 text
Ако бяха заложили по равно,
всеки трябваше да вземе 100/3лв
100/3 ≈ 33.33
Slide 160
Slide 160 text
Нито float, нито BigDecimal ще
поддържат това
Slide 161
Slide 161 text
Rational
Slide 162
Slide 162 text
ℂ
комплексни числа
Slide 163
Slide 163 text
i = √-1
i2 = -1
Slide 164
Slide 164 text
имагинерна единица
Slide 165
Slide 165 text
a + bi
a, b ∈ ℝ
Slide 166
Slide 166 text
реална част имагинерна част
a + bi
Slide 167
Slide 167 text
(a + bi) + (c + di) =
= a + c + bi + di =
= (a + c) + (b + d)i
(a + bi)(c + di) =
= ac + adi + cbi + bdi2 =
= ac - bd + adi + cbi =
= (ac - bd) + (ad + cb)i