AnnTHony
@AnnTHony
Интроверт

Алгоритм приведения вещественного числа к одинарной точности?

Подскажите алгоритм для перевода вещественного числа (с плавающей точкой) из двойной точности (64 бита) в одинарную точность (32 бита).
  • Вопрос задан
  • 303 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Примерно так это можно сделать:
  • скопировать знак;
  • извлечь порядок, отделить специальные случаи:
    • 0 и денормализованные числа становятся нулём;
    • бесконечность -- бесконечностью;
    • не-числа -- не-числами с обрезанной под новую точность мантиссой
  • в противном случае (обычное значение) убрать смещение порядка для double;
  • проверить, что несмещённый порядок помещается в диапазон float. Возможны 4 варианта:
    • не помещается (больше) -- записать в результат бесконечность;
    • помещается -- извлечь мантиссу;
    • не помещается (меньше, но может поместиться как денормализованное) -- извлечь мантиссу, добавить явный старший бит, сдвинуть вправо на разность порядка, извлечённого из double и минимального порядка float. Заменить извлечённый порядок минимальным порядком float;
    • не помещается (меньше) -- записать в результат 0;
  • добавить смещение порядка для float и запаковать в результат;
  • извлечь мантиссу, округлить, согласно текущей модели округления (см. [3]);
    • если при этом случилось переполнение увеличить порядок float (если тут тоже случилось переполнение, то в результате будет записан INF, что и требовалось);
  • запаковать мантиссу в результат.


Ссылки:
[1] https://en.wikipedia.org/wiki/Single-precision_flo...
[2] https://en.wikipedia.org/wiki/Double-precision_flo...
[3] https://en.wikipedia.org/wiki/IEEE_floating_point#...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
gbg
@gbg
Любые ответы на любые вопросы
А просто. Берете компилятор С++, отправляете в него что-то типа
volatile double a;
cin >> a;
volatile float b=a;

Потом компилируете это в ассемблерный листинг (у gcc это ключ -S) и смотрите, что получилось.

На современных процессорах это делает инструкция CVTSD2SS
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы