Округление до ближайшего целого числа с плавающей точкой - PullRequest
5 голосов
/ 17 февраля 2012

Как округлить число с плавающей запятой до ближайшего целого числа?Я ищу алгоритм с точки зрения двоичного кода, так как я должен реализовать код в сборке.

Ответы [ 3 ]

5 голосов
/ 17 февраля 2012

ОБНОВЛЕНО методом правильного округления до четного.

Основной алгоритм:

Сохранение 23-степени + 1-го бита (после десятичной точки).Затем обнулите младшие значащие биты (23-экспонента).Затем используйте сохраненный бит и новый LSB для округления.Если запомненный битовый бит равен 1, добавьте его в младший бит не усеченной части и при необходимости нормализуйте.Если сохраненный бит равен 0, ничего не делать.

**

Для результатов, соответствующих стандарту IEEE-754:

** Перед обнулением младших значащих битов (с 23 показателями) ИЛИ вместе с младшими значащими битами с 22 показателями.Назовите результат этого ИЛИ бита округления.Сохраненный (23-экспонента + 1) бит (после десятичной запятой) будет называться защитным битом.Затем обнуляют (23-экспонентные) младшие значащие биты.

Если защитный бит равен нулю, ничего не делать.

Если защитный бит равен 1, а залипающий бит равен 0,добавьте единицу к младшему разряду, если младший разряд равен 1.

Если защитный бит равен 1, а бит залипания равен 1, добавьте единицу к младшему разряду.


Вот несколько примеров использованияосновной алгоритм:

x = 62,3

    sign exponent             mantissa
x =  0      5       (1).11110010011001100110011

Шаг 1: Сохранение экспоненты + 1-й бит (после десятичной точки)

экспонента + 1 = 6-йбит

сохраненный бит = 0

Шаг 2: Обнулить 23 младших разряда младших разрядов 23-экспонента = 18, поэтому мы обнуляем 18 младших разрядов

    sign exponent             mantissa
x =  0      5       (1).11110000000000000000000

Шаг3: использовать следующий бит для округления Так как сохраненный бит равен 0, мы ничего не делаем, а число с плавающей запятой округлено до 62.


Другой пример:

x =21,9

    sign exponent             mantissa
x =  0      4       (1).01011110011001100110011

Шаг 1: сохранить показатель степени + 1-й бит (после десятичной точки)

показатель степени + 1 = 5-й бит

сохраненный бит = 1

Шаг 2: обнуление 23-expмладшие значащие биты 23-экспонента = 19, поэтому мы обнуляем 19 младших битов

    sign exponent             mantissa
x =  0      4       (1).01010000000000000000000

Шаг 3. Использование следующего бита для округления Так как сохраненный бит равен 1, мы добавляем единицу к младшему битуусеченную часть и получим 22, что является правильным числом:

Начнем с:

    sign exponent             mantissa
x =  0      4       (1).01010000000000000000000

Добавьте одну в этом месте:

+                          1

И мы получим 22:

    sign exponent             mantissa
x =  0      4       (1).01100000000000000000000
0 голосов
/ 17 февраля 2012

Есть инструкция SSE для раунда до ближайшего: http://www.musicdsp.org/showone.php?id=246

inline int float2int(float x) {
    int i;
    __asm {
        fld x
        fistp i
    }
    return i;
}
0 голосов
/ 17 февраля 2012

Уменьшить показатель степени на 1, добавить 1, увеличить показатель степени на 1, усечь. Или просто добавьте 0.5 и обрежьте. В зависимости от того, что плывет на вашей лодке.

...