waspagv: (инспектор)
DCS Foyle ([personal profile] waspagv) wrote2015-01-26 01:20 pm

(no subject)

А есть ли в языке 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). Совершенно точно переносимо и скорее всего эффективнее, чем приведено выше.

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

[identity profile] dims12.livejournal.com 2015-01-26 08:12 am (UTC)(link)
P.S. Нет, я неправ, endianness всё равно не определена, даже если стандарт IEEE 754

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

[identity profile] pphantom.livejournal.com 2015-01-26 08:52 am (UTC)(link)
Кажется, нет. Но, в принципе, можно сделать разные варианты, используя fenv.h.

[identity profile] waspagv.livejournal.com 2015-01-26 09:44 am (UTC)(link)
Спасибо. Нашел. Запись обновил: добавил решение.