Страницы

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

четверг, 19 декабря 2019 г.

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

#cpp #c


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


Ответы

Ответ 1



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

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

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