Как процессор "отбрасывает" значение x87 с плавающей запятой (я думаю)? - PullRequest
0 голосов
/ 07 мая 2020

Я просто хотел знать, как ЦП «преобразовывает» число с плавающей запятой. Я имею в виду, я полагаю, что когда мы используем «float» или «double» в C / C ++, компилятор использует модуль x87, или я ошибаюсь? (я не смог найти ответ) Итак, если это так, а числа с плавающей запятой не эмулируются, как компилятор их преобразовывает?

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Я имею в виду, я полагаю, что когда мы используем «float» или «double» в C / C ++, компилятор использует модуль x87, или я ошибаюсь?

На современных процессорах Intel компилятор может использовать регистры SSE / AVX. FPU часто не используется регулярно.

Я просто хотел знать, как ЦП «преобразовывает» число с плавающей запятой.

Преобразование целого числа в число с плавающей запятой. номер точки - это вычисление, которое в основном (за исключением некоторых деталей):

  • Начинается с двоичного (для беззнаковых типов) или двоичного дополнения (для подписанных типов) представления целого числа.
  • Если число равно нулю, вернуть все биты ноль.
  • Если оно отрицательное, запомните это и отмените число, чтобы сделать его положительным.
  • Найдите самый высокий бит, установленный в целом числе.
  • Найдите самый младший бит, который будет соответствовать значению формата назначения. (Например, для формата binary32 IEEE-754, обычно используемого для float, 24 бита подходят в мантиссе, поэтому 25 th бит после самого высокого набора битов не подходит.)
  • Округлите число в той позиции, где заканчивается мантисса.
  • Вычислите показатель степени, который является функцией того места, где установлен самый высокий бит. Добавьте «смещение», используемое при кодировании экспоненты (127 для двоичного 32, 1023 для двоичного 64).
  • Соберите знаковый бит, биты для экспоненты и биты для мантиссы (опуская старший бит, потому что он всегда один). Верните эти биты.

Это вычисление подготавливает биты, представляющие число с плавающей запятой. (Он опускает детали, связанные с особыми случаями, такими как NaN, бесконечности и субнормальные числа, потому что они не возникают при преобразовании типичных целочисленных форматов в типичные форматы с плавающей запятой.)

Это вычисление может выполняться «программно» (что есть с общими инструкциями для сдвига битов, проверки значений и т. д.) или «аппаратно» (то есть со специальными инструкциями для выполнения преобразования). На всех настольных компьютерах есть инструкции для этого. Маленькие процессоры для встроенного специального назначения могут не иметь таких инструкций.

1 голос
/ 07 мая 2020

Непонятно, что вы подразумеваете под

«приведение» числа с плавающей запятой. ?

Если целевая архитектура имеет FPU, то компилятор будет выдавать инструкции FPU для управления переменными с плавающей запятой, никакой мистерии ... Чтобы присвоить переменную float переменной int, float необходимо усечь или закругленные (вверх или вниз). Для этой цели обычно существуют специальные инструкции.

Если целевая архитектура «без FPU», то компилятор (инструментальная цепочка) может обеспечить программную реализацию операций с плавающей запятой с использованием доступных инструкций ЦП. Например, выражение вида a = x * y; будет эквивалентно a = fmul (x, y); Где fmul () - это специальная функция, предоставляемая компилятором (intrinsi c) для выполнения операций с плавающей запятой без FPU. Конечно, это обычно НАМНОГО медленнее, чем при использовании аппаратного FPU. Арифметика с плавающей запятой c не используется на таких платформах, если производительность имеет значение, вместо этого можно использовать арифметику с фиксированной запятой c https://en.wikipedia.org/wiki/Fixed-point_arithmetic.

...