- •If (n&1){ . . .} – проверяет, является ли n нечётным.
- •If (n&m){ . . .} - проверяет, есть ли у n и m совпадающие соответствующие биты.
- •If (n&(n-1)){ . . .}– проверяет, что n не является степенью 2. Если n есть степень 2, то n представляется в двоичном виде:
- •Void inint (tip n, char s[])
- •Void inint16(tip n, char s[])
- •Число –3.5: с0 0с 00 00 00 00 00 00
- •Double сохраняется в памяти 15-16 десятичных знаков. Выполнение операций над числами, представленными с плавающей точкой (говорят- в плавающей арифметике).
- •Достоинства формы представления чисел с плавающей точкой.
- •Недостатки формы представления чисел с плавающей точкой:
Число –3.5: с0 0с 00 00 00 00 00 00
Диапазон чисел, представимых в формате с плавающей точкой (тип double): |X|min <=|X|<=|X|max и X=0 1<=P’<=2046
|M|min*2pmin <=|X| <=|M|max*2pmax и X=0
1*2-1022<=|X| <=(2-2-52)*21023 и X=0
10k<=|X| <=10L lg2=0.30103
k= –1022*lg 2= –307.65266= -308+0.34734
L= 1024* lg 2=1024*0.30103=308.25472
2.2*10-308<=|X| <=1.7*10308 и X=0
__[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\] _____|_____[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]______
–Xmax -Xmin 0 Xmin Xmax
Точность чисел, представленных в формате с плавающей точкой: часто вместо числа Х в МС хранится его приближение Х*. Погрешность вносится из-за хранения приближенного значения мантиссы.
Абсолютная погрешность числа Х*: |X – X*| = ∆( Х*) =|MX –MX*|*2px= 2-52*2px т.е. абсолютная погрешность числа зависит от порядка числа.Обычно для формата с плавающей точкой определяют относительную погрешность Х* : (Х*)
Для пользователя более важным является практический вопрос: сколько значащих цифр десятичного представления числа гарантированно сохраняются при таком формате хранения числа. Есть приближенное правило для определения этого количества К цифр при q=2:
m двоичных разрядов мантиссы соответствуют К десятичным цифрам: К[m / 3.32]; Для типа double К=[53/3.32]=15.96, т.е. для значения типа
Double сохраняется в памяти 15-16 десятичных знаков. Выполнение операций над числами, представленными с плавающей точкой (говорят- в плавающей арифметике).
Пусть X = Mx2Px ,а Y = My2Py
a)Сложение (вычитание) чисел:
Z = X Y = Mx2Px My2Py ={1шаг–выравнивание порядков к большему; пусть Px >Py}
= 2Px(Mx My2Py–Px) = {2 шаг–сдвиг мантиссы My на |Py–Px| разрядов}
= 2Pxmz = {3шаг–сложение(вычитание) мантисс, получается мантисса mz}.
= Mz EPz
Возможны случаи:
1 |mz| < 2 операция закончена, Mz = mz ; Pz = Px ;
2 |mz| выполняется нормализация результата сдвигом мантиссы вправо на 1 разряд с коррекцией порядка (+1);
|mz| <1 выполняется нормализация результата сдвигом мантиссы влево на t разрядов с коррекцией порядка (–t).
з pх 1.ххххх
– з py 1.xxyyy
з pх 0.00zzz При вычитании близких чисел происходит
з pz 1.zz??? потеря точности
б)Умножение :
Z = X Y = Mx2Px My2Py = MxMy2Px+Py == Mz 2Pz , где Mz = MxMy ; Pz = Px+Py; т.е. при умножении чисел их мантиссы перемножаются, а порядки складываются. При умножении двух мантисс может получиться результат такой, что потребуется сдвиг мантиссы вправо, но не более, чем на один разряд, тогда нужна коррекция порядка (+1).
в)Деление :
т.е. при делении чисел их мантиссы
делятся, а порядки вычитаются. При
делении двух мантисс может потребоваться
для полученной мантиссы сдвиг влево,
но не более, чем на один разряд с коррекцией
порядка (–1).
Особые ситуации плавающей арифметики.
Переполнение порядка при выполнении операций плавающей арифметики;
некорректность деления в плавающей арифметике: деление на число с нулевой мантиссой;
потеря значимости: Pz 0, а Mz = 0;
исчезновение порядка: Pz < Pmin , а Mz 0.
Две последние ситуации не являются аварийными, они обычно приводят к тому, что результат Z заменяется нулём – это машинный нуль.
