Лекция 3. Числа с плавающей точкой

Числа с плавающей точкой

float – число с плавающей точкой одинарной точности. На большинстве архитектур реализовано по стандарту IEEE754 одинарной точности и занимает 4 байта

double – число с плавающей точкой двойной точности, обычно реализовано по стандарту IEEE754 двойной точности и занимает 8 байт.

long double - у Intel/AMD числа с плавающей точкой длиной 10 или 16 байт.

Чем больше памяти в числе, тем выше его точность.

картинка

s - знаковый бит E - экспонента M - мантисса

IEEE754 float

|1|   8   |    23 бит |

IEEE754 double

|1|  11   |    52 бит |

число с плавающей точкой 1x...x.x...x = (-1)^S 1.x..x (мантисса) 2^E (это выражение двигает двоичную точку)

float - 7 десятичных значащих цифр.

double - 15 десятичных значащих цифр.

\(float_{max} \approx 10^{38}\)

\(double_{max} \approx 10^{308}\)

Функция printf

printf(форматная_строка, аргумент1, ..., аргументN);

Форматы вывода

%d int как десятичное

%x int как 16-ричное

%10d int как десятичное в поле шириной 10 знаков (слева добавляются пробелы)

%10d int как десятичное в поле шириной 10 знаков (слева добавляются нули)

%u - unsigned

%ld long

%f - float, десятичное, 6 знаков после запятой

%.4f - float, десятичное, 4 знака после запятой

%10.4f - float, десятичное, 4 знака после запятой, в поле шириной 10.

%10.4f - float, десятичное, 4 знака после запятой, в поле шириной 10 (слева нули)

%e - числа в научной нотации (1.23e2)

%lf %.4lf %10.4lf - для double %10.4lf %le

scanf

int x;
float a;
double b;
scanf("%d", &x);
scanf("%f", &a);
scanf("%lf", &b);

Если забыть символ &, то программа завершится с ошибкой “Segmentation Fault”.

scanf("%d%f%lf", &x, &a, &b);

Округления при работе с плавающей точкой

3.14 + 1e20 - 1e20 == 0.0
3.14 + (1e20 - 1e20) == 3.14

Приведение типов

Если один из операндов арифметической операции - число с плавающей точкой, а другой целое число, то перед операцией целый операнд будет приведён к типу с плавающей точкой.

1 / 3 == 0

1.0 / 3 == 0.33...
1 / 3.0 == 0.33...
1.0 / 3.0 == 0.33...

Математическая библиотека

#include <stdio.h>
#include <math.h>

int main(void)
{
    double x, x0, x1;
    scanf("%lf%lf", &x0, &x1);
    for(x = x0; x <= x1; x = x + 0.1) {
        double y = sin(x); // Инициализируется каждый раз.
        printf("%lf %lf\n", x, y);
    }
    return 0;
}

Обратите внимание, что при использовании функций математической библиотеки нужно компилировать программу с ключом -lm

gcc -lm prog.c

В противном случае компилятор не найдёт математические функции, даже если подключён math.h.

TODO объяснить, почему