Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция гиперболического тангенса, Сколько операций? 
:(
    Опции темы
cucutnog
Дата 8.4.2013, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 19.11.2012

Репутация: нет
Всего: нет



Всем добрый день!

 Если взять два числа A и B и сложить их, то процессор проделает одну операцию сложения,так?

 А сколько операций и каких проделает процессор, если я хочу взять гиперболический тангенс от аргумента? 

 Например, tanh(3).

 Такой же вопрос про экспоненту в какой либо степени. Напрмиер, exp(3)
PM MAIL   Вверх
baldina
Дата 8.4.2013, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(cucutnog @  8.4.2013,  14:42 Найти цитируемый пост)
Если взять два числа A и B и сложить их, то процессор проделает одну операцию сложения,так?

если речь идет о встроенных операциях процессора, то да. если о тактах - зависит от процессора, типа операндов и т.д.

Цитата(cucutnog @  8.4.2013,  14:42 Найти цитируемый пост)
А сколько операций и каких проделает процессор, если я хочу взять гиперболический тангенс от аргумента?
Такой же вопрос про экспоненту в какой либо степени. Напрмиер, exp(3) 

обычно это встроенные в сопроцессор функции. 

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

кстати, некоторые процессоры (например любимый Pentium) имеют ядро с простым набором команд, а операции, которые мы считаем командами процессора на самом деле исполняются микрокодом.

Добавлено через 1 минуту и 9 секунд
ЗЫ: программиста на ЯВУ это не должно сильно волновать))))
PM MAIL   Вверх
borisbn
Дата 8.4.2013, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Вот код exp из студии (кол-во операций считай сам)
Код

/* coefficients */
static const double p[] = {    /* courtesy Dr. Tim Prince */
    1.0,
    420.30235984910635,
    15132.70094680474802};
static const double q[] = {    /* courtesy Dr. Tim Prince */
    30.01511290683317,
    3362.72154416553028,
    30265.40189360949691};
static const double c1 = 22713.0 / 32768.0;
static const double c2 = 1.4286068203094172321214581765680755e-6;
static const double hugexp = HUGE_EXP;
static const double invln2 = 1.4426950408889634073599246810018921;

_CRTIMP2_PURE short __CLRCALL_PURE_OR_CDECL _Exp(double *px, double y, short eoff)
    {    /* compute y*e^(*px), (*px) finite, |y| not huge */
    if (*px < -hugexp || y == 0.0)
        {    /* certain underflow */
        *px = 0.0;
        return (0);
        }
    else if (hugexp < *px)
        {    /* certain overflow */
        *px = _Inf._Double;
        return (_INFCODE);
        }
    else
        {    /* xexp won't overflow */
        double g = *px * invln2;
        short xexp = (short)(g + (g < 0.0 ? - 0.5 : + 0.5));

        g = xexp;
        g = (*px - g * c1) - g * c2;
        if (-_Eps._Double < g && g < _Eps._Double)
            *px = y;
        else
            {    /* g*g worth computing */
            const double z = g * g;
            const double w = (q[0] * z + q[1]) * z + q[2];

            g *= (z + p[1]) * z + p[2];
            *px = (w + g) / (w - g) * 2.0 * y;
            --xexp;
            }
        return (_Dscale(px, (long)xexp + eoff));
        }
    }

а вот ф-ция _Dscale
Код

_CRTIMP2_PURE short __CLRCALL_PURE_OR_CDECL _Dscale(double *px, long lexp)
    {    /* scale *px by 2^xexp with checking */
    unsigned short *ps = (unsigned short *)(char *)px;
    short xchar = (short)((ps[_D0] & _DMASK) >> _DOFF);

    if (xchar == _DMAX)
        return ((short)((ps[_D0] & _DFRAC) != 0 || ps[_D1] != 0
            || ps[_D2] != 0 || ps[_D3] != 0 ? _NANCODE : _INFCODE));
    else if (xchar == 0 && 0 < (xchar = _Dnorm(ps)))
        return (0);

    if (0 < lexp && _DMAX - xchar <= lexp)
        {    /* overflow, return +/-INF */
        *px = ps[_D0] & _DSIGN ? -_Inf._Double : _Inf._Double;
        return (_INFCODE);
        }
    else if (-xchar < lexp)
        {    /* finite result, repack */
        ps[_D0] = (unsigned short)(ps[_D0] & ~_DMASK
            | (lexp + xchar) << _DOFF);
        return (_FINITE);
        }
    else
        {    /* denormalized, scale */
        unsigned short sign = (unsigned short)(ps[_D0] & _DSIGN);

        ps[_D0] = (unsigned short)(1 << _DOFF | ps[_D0] & _DFRAC);
        lexp += xchar - 1;
        if (lexp < -(48 + 1 + _DOFF) || 0 <= lexp)
            {    /* certain underflow, return +/-0 */
            ps[_D0] = sign;
            ps[_D1] = 0;
            ps[_D2] = 0;
            ps[_D3] = 0;
            return (0);
            }
        else
            {    /* nonzero, align fraction */
            short xexp = (short)lexp;
            unsigned short psx = 0;

            for (; xexp <= -16; xexp += 16)
                {    /* scale by words */
                psx = ps[_D3] | (psx != 0 ? 1 : 0);
                ps[_D3] = ps[_D2];
                ps[_D2] = ps[_D1];
                ps[_D1] = ps[_D0];
                ps[_D0] = 0;
                }
            if ((xexp = (short)-xexp) != 0)
                {    /* scale by bits */
                psx = (ps[_D3] << (16 - xexp)) | (psx != 0 ? 1 : 0);
                ps[_D3] = (unsigned short)(ps[_D3] >> xexp
                    | ps[_D2] << (16 - xexp));
                ps[_D2] = (unsigned short)(ps[_D2] >> xexp
                    | ps[_D1] << (16 - xexp));
                ps[_D1] = (unsigned short)(ps[_D1] >> xexp
                    | ps[_D0] << (16 - xexp));
                ps[_D0] >>= xexp;
                }

            ps[_D0] |= sign;
            if ((0x8000 < psx || 0x8000 == psx && (ps[_D3] & 0x0001) != 0)
                && (++ps[_D3] & 0xffff) == 0
                && (++ps[_D2] & 0xffff) == 0
                && (++ps[_D1] & 0xffff) == 0)
                ++ps[_D0];    /* round up */
            else if (ps[_D0] == sign && ps[_D1] == 0
                && ps[_D2] == 0 && ps[_D3] == 0)
                return (0);
            return (_FINITE);
            }
        }
    }



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1028 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.