WikiSort.ru - Не сортированное

ПОИСК ПО САЙТУ | о проекте

Число́ одина́рной то́чности (англ. single precision, single) — широко распространенный компьютерный формат представления вещественных чисел, занимающий в памяти 32 бита (4 байта). Как правило, под ним понимают формат числа с плавающей запятой стандарта IEEE 754.

Числа одинарной точности с плавающей запятой обеспечивают относительную точность 7-8 десятичных цифр в диапазоне от до примерно .

В современных компьютерах вычисления с числами с плавающей запятой поддерживаются аппаратным сопроцессором (FPU — англ. floating point unit). Однако во многих вычислительных архитектурах нет аппаратной поддержки чисел с плавающей запятой и тогда работа с ними осуществляется программно.

Знак
Порядок Мантисса
0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  = 0,15625
31 24 23 16 15 8 7 0

Для вычисления показателя степени из восьмиразрядного поля порядка вычитается смещение порядка равное 12710 = 7F16 = 011111112 (то есть, 011111002 - 011111112 = 12410 - 12710 = -310). Так как в нормализованной двоичной мантиссе целая часть всегда равна единице, то в поле мантиссы записывается только её дробная часть. Для вычисления мантиссы к единице добавляется дробная часть мантиссы из 23-х разрядного поля дробной части мантиссы 1,010000000000000000000002. Число равно произведению мантиссы со знаком на двойку в степени порядка = 1,012*210-310 = 1012*210-510 = 510*210-510 = 0,1562510.

Общий шаблон для побитового доступа

union {
    float    fl;
    uint32_t dw;
} f;
int s = ( f.dw >> 31 ) ? -1 : 1;   /* Знак */
int e = ( f.dw >> 23 ) & 0xFF;     /* Порядок */
int m =                            /* Мантисса */
  e ?
    ( f.dw & 0x7FFFFF ) | 0x800000 :
    ( f.dw & 0x7FFFFF ) << 1;

Результирующая формула расчёта (число одинарной точности) будет s * (m * 2 ^ -23) * (2 ^(e-127)).

Примеры использования

Python

Конвертирует целочисленное представление числа с одинарной точностью (в виде четырёх байт, младшие вначале) во встроенный тип действительных чисел Python'а.

def dw2float(dw_array):
    assert (len(dw_array) == 4)
    dw = int.from_bytes(dw_array, byteorder='little',signed=False)
    s = -1 if (dw >> 31) == 1 \
        else 1                                    # Знак
    e = ( dw >> 23 ) & 0xFF;                      # Порядок
    m = ((dw & 0x7FFFFF ) | 0x800000) if e != 0 \
        else ((dw & 0x7FFFFF ) << 1)              # Мантисса
    m1 = m*(2**(-23))                             # Мантисса в float
    return s*m1*(2**(e-127))

0.1562510 в формате float записывается как 3E20000016, что эквивалентно четырём байтам: [0x00,0x00,0x20,0x3E]. Вывод программы:

 
In[1]: dw2float([0x00,0x00,0x20,0x3E])
Out[1]: 0.15625
In[2]: dw2float([0x00,0x00,0x20,0xBE])
Out[2]: -0.15625

Примеры чисел одинарной точности

Эти примеры представлены в шестнадцатеричном виде чисел с плавающей запятой. Они включают знаковый бит, порядок и мантиссу.

3f80 0000 = 1
c000 0000 = −2

7f7f ffff ≈ 3.4028234 × 1038  (максимальное одинарной точности)
0000 0001 = 2-149 ≈ 1.401298464 × 10−45 (Минимальное положительное число одинарной точности — денормализованное)
0080 0000 = 2-126 ≈ 1.175494351 × 10−38 (Минимальное нормализованное положительное число одинарной точности)

0000 0000 = 0
8000 0000 = −0

7f80 0000 = infinity
ff80 0000 = −infinity
				
3eaa aaab ≈ 1/3

По умолчанию, 1/3 округляется вверх, в отличие от чисел двойной точности.

См. также

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии