[personal profile] waspagv
А есть ли в языке C стандартная библиотека функций для работы с вещественными числами на битовом уровне? Нужны вещи типа: узнать порядок (двоичный) числа, изменить этот порядок на заданную величину, выделить мантиссу и т.п. Я, конечно, могу сделать все это с помощью масок и сдвигов, но тогда программа станет непереносимой. Не хочу привязываться к конкретному представлению.

Любопытно, что в ISO-стандарте языка Modula-2 такие модули есть: LowReal и LowLong.

UPD. Собственно, мне нужно найти мантиссу разности двух чисел a и b, когда порядки их приведены к наибольшему из порядков чисел a,b и с. Задачу решает следующая универсальная, но неэффективная процедура comp:

int expon(double x)
{
    if (x==0.0)
        return -999;
    else
        return floor(log10(fabs(x))+1);
}

double comp(double a, double b, double c)
{
    int ae,be,ce;
    ae = expon(a); be = expon(b); ce = expon(c);
    if (ae    if (ae    return fabs(a-b)/pow(10.0,ae);
}


UPD2. Решил задачу функциями ldexp и frexp из <math.h> (спасибо [livejournal.com profile] dims12). Совершенно точно переносимо и скорее всего эффективнее, чем приведено выше.
Date: 26 January 2015 08:00 (UTC)

From: [identity profile] dims12.livejournal.com
Если не ошибаюсь, битовое представлениие вещественных чисел переносимо само по себе, в отличие от целых...
Date: 26 January 2015 08:12 (UTC)

From: [identity profile] dims12.livejournal.com
P.S. Нет, я неправ, endianness всё равно не определена, даже если стандарт IEEE 754

А для извлечения частей есть функция frexp: http://en.wikibooks.org/wiki/C_Programming/C_Reference/math.h/frexp
Edited Date: 26 January 2015 08:15 (UTC)
Date: 26 January 2015 08:52 (UTC)

From: [identity profile] pphantom.livejournal.com
Кажется, нет. Но, в принципе, можно сделать разные варианты, используя fenv.h.
Date: 26 January 2015 09:44 (UTC)

From: [identity profile] waspagv.livejournal.com
Спасибо. Нашел. Запись обновил: добавил решение.

Профиль

waspagv: (Default)
DCS Foyle

March 2025

M T W T F S S
     12
3456789
10111213141516
17181920212223
242526272829 30
31      

Style Credit

Expand Cut Tags

No cut tags
Page generated 06/07/2025 23:08
Powered by Dreamwidth Studios