Страницы

Поиск по вопросам

пятница, 9 ноября 2018 г.

Как в оперативной памяти представлены числа с плавающей запятой?

Как в оперативной памяти представить вещественное число, если с обычными числами вроде все более менее понятно (под переменную выделяется память и туда в двоичной форме записывается число), то с вещественными числами не все так просто понять)) Как вообще компьютер понимает дробное это число или нет, как он понимает как его нужно складывать, делить и умножать. И еще вопрос из этой же темы почему разрядность процессора влияет на точность вещественного число. Ведь если мы возьмем 32 битный процессор и возьмем тип данных long, который занимает 64 бита, то процессор не сможет за раз обработать число с этим типом данных и он разобьет эту операцию на несколько инструкций, так вот почему так нельзя сделать с вещественным числом и получить высокую точность? Заранее спасибо за ответы!


Ответ

Как вообще компьютер понимает дробное это число или нет, как он понимает как его нужно складывать, делить и умножать.
Процессор никак не может знать тип данных, хранящийся по тому или иному адресу памяти. Для него это просто последовательность байт. Смысл, структура и размер определяются исключительно текущей командой процессора и её флагами. То есть вы можете, например, сначала записать по некоему адресу целое восьмибайтное число (mov [адрес], 1234567812345678h), а затем взять первые четыре байта из восьми и поместить их в стек математического сопроцессора, будто это дробное число одинарной точности (fld dword [адрес]). Разумеется, значение в стеке будет уже другим, так как хоть байты одни и те же, но изменилась их интерпретация.
То есть единственное место процессора, знающее как работать с вещественными числами — это соответствующая часть арифметико-логического устройства. Для остальной части процессора это просто некая последовательность байт.
Однако из этого правила есть исключения. Например Эльбрусы работают с меченой (тегированной) памятью, где тип данных в каждой ячейке задаётся при записи в неё и хранится в области атрибутов. И тут процессор действительно знает, какой тип данных где лежит.
Как в оперативной памяти представить вещественное число, если с обычными числами вроде все более менее понятно (под переменную выделяется память и туда в двоичной форме записывается число), то с вещественными числами не все так просто понять
Из первого пункта ответа становится понятным, что для переменных типа чисел с плавающей запятой также выделяется память, и туда также в двоичном виде записывается число (четыре байта для чисел одинарной точности и восемь для двойной).
И еще вопрос из этой же темы почему разрядность процессора влияет на точность вещественного числа? Ведь если мы возьмем 32 битный процессор и возьмем тип данных long, который занимает 64 бита, то процессор не сможет за раз обработать число с этим типом данных и он разобьет эту операцию на несколько инструкций, так вот почему так нельзя сделать с вещественным числом и получить высокую точность?
Какой бы из двух способов обработки вещественных мы не выбрали, ни один из них не зависит от разрядности процессора:
Intel 8087 (который FPU) и его эмуляция в более современных процессорах работают в своём, 80-разрядном формате, который фиксирован и никак не может совпадать с разрядностью процессора, ибо не степень двойки. Скалярные операции (SIMD — например SSE или AVX) также оперируют буферами фиксированного размера в 128 бит, превышающего разрядность процессора. Соответственно, и разбиение этого буфера на отдельные числа также ни на что не завязано, ибо за это также отвечает отдельный вычислительный блок.
Таким образом, разрядность процессора влияет здесь только опосредованно и только на количество тактов, требуемое для загрузки вещественных чисел.
А вот на что разрядность действительно влияет, так это на размер обычных регистров, которые как раз и используются в целочисленной арифметике.
Как вообще хранится это число в памяти? Имеется в виду как отделяется целая часть от дробной, если в жизни мы можем отделить по знаку запятой, то как компьютер хранит это в памяти? Отдельно целую отдельно дробную часть?
Если говорить простыми словами, вещественное число хранится как совокупность трёх компонент:
Знак (хранится отдельно для нужд математического анализа, где существуют положительный и отрицательный ноль). Число вида 1,xxxxxxx.... Причём способ хранения этого числа достаточно интересный, в виде суммы вида:
    
где различные a — это нули и единицы, значение которых формирует мантиссу Количество двоичных разрядов, на которое надо сдвинуть запятую для получения нужного числа. В десятичном виде это будет выглядеть как умножение на целую степень двойки. Это называется порядок
Но это верно только для стандарта IEEE 754. Существуют архитектуры и с другим представлением вещественных чисел, однако они не так распространены.

Комментариев нет:

Отправить комментарий