Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
GOLDProFA
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 28
#1

Нужен исходный код функции sinh() и cosh() из библиотеки math.h - C++

14.06.2014, 21:24. Просмотров 2846. Ответов 60
Метки нет (Все метки)

Нужен исходный код функции sinh() и cosh() из библиотеки math.h. Искал в библиотеке - не нашел.
Задача: написать программу которая будет вычислять гиперболический косинус и синус. НЕ ИСПОЛЬЗУЯ sinh() и cosh(), а также не использовать функции ( exp (x) + exp (-x) ) / 2 и ( exp (x) - exp (-x) ) / 2. За помощь буду крайне благодарен и отблагодарю!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2014, 21:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Нужен исходный код функции sinh() и cosh() из библиотеки math.h (C++):

Как выглядит исходный код функции sqrt стандартной библиотеки math.h?
Здраствуйте. Мне надо исходный код функции sqrt стандартной библиотеки math.h ....

Нужно ли копировать весь исходный код библиотеки в папку со своей программой?
Итак, я скомпилировал библиотеку Box2d, получил файл libBox2D.a, и есть...

Вычисление функции sinh разложением в ряд Тейлора
Добрый день, помогите составить блок-схему по задаче, или хотя бы подскажите...

Реализация функций из библиотеки math.h
Нужно написать прогу реализующая 4 функции из библиотеки math.h с помощь...

записать формулу при помощи библиотеки math.h
Помогите пожалуйста , для примера записать формулу при помощи math.h желательно...

Где находятся стандартные библиотеки c++ типа <math.h>
Здравствуйте, нужна информация: куда устанавливаются и где можно откопать...

60
nmcf
6245 / 5557 / 2527
Регистрация: 14.04.2014
Сообщений: 23,361
14.06.2014, 21:38 #2
А почему ты считаешь, что там не используется экспонента?
В твоём случае можно использовать разложение в ряд, суммировать члены ряда. http://ru.wikipedia.org/wiki/%C3%E8%...ED%EA%F6%E8%E8
0
GOLDProFA
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 28
14.06.2014, 21:40  [ТС] #3
Я знаю что там используется экспонента, но я говорю чтобы функцию exp() не использовали. И понимаю, что надо использовать ряды и т.д., но сам этого сделать не могу (знаний не хватает). Надеюсь на вашу помощь!
0
nmcf
6245 / 5557 / 2527
Регистрация: 14.04.2014
Сообщений: 23,361
14.06.2014, 21:41 #4
Я же тебе дал ссылку. Там приведены формулы рядов. Делай цикл и суммируй до нужной точности.
0
GOLDProFA
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 28
14.06.2014, 22:08  [ТС] #5
Я же написал что знаний не хватит
0
Drdoc
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 6
14.06.2014, 22:09 #6
GOLDProFA, так подтяни мат. анализ
0
GOLDProFA
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 28
14.06.2014, 22:10  [ТС] #7
Легко сказать. Блесни умом и помоги сделать, отблагодарю
0
Drdoc
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 6
14.06.2014, 22:12 #8
GOLDProFA, я бы помог, да сейчас своих проектов много, и сессия начинается
0
GOLDProFA
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 28
14.06.2014, 22:16  [ТС] #9
Удачи все сдать. Может кто еще поможет?
0
ValeryS
Модератор
7134 / 5402 / 669
Регистрация: 14.02.2011
Сообщений: 18,226
14.06.2014, 22:18 #10
Цитата Сообщение от GOLDProFA Посмотреть сообщение
Нужен исходный код функции sinh() и cosh() из библиотеки math.h.
легко
компилируешь простейшую программу с этой функцией

потом натравливаешь на неё дизасемблер, и анализируешь код
1
GOLDProFA
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 28
14.06.2014, 22:19  [ТС] #11
Я не знаю как это сделать. Может Вы поможете?
0
nmcf
6245 / 5557 / 2527
Регистрация: 14.04.2014
Сообщений: 23,361
14.06.2014, 22:31 #12
Ты шутишь? Что ему ассемблерный код даст? Ряд простейший. Тут куча тем про ряды была.
0
ValeryS
Модератор
7134 / 5402 / 669
Регистрация: 14.02.2011
Сообщений: 18,226
14.06.2014, 22:52 #13
Цитата Сообщение от nmcf Посмотреть сообщение
Ты шутишь?
отнюдь
Обратный инженеринг слышал?
Цитата Сообщение от nmcf Посмотреть сообщение
Что ему ассемблерный код даст?
Ну ему может ничего
а нормальному хакеру многое
но думаю что нормальный хакер не будет это дизасемблировать, он и так знает алгоритмы
но ведь надо же с чегото начинать
0
nmcf
6245 / 5557 / 2527
Регистрация: 14.04.2014
Сообщений: 23,361
14.06.2014, 22:57 #14
Разумеется слышал и делал. Только ты предлагаешь усложнение задачи, прощу суммировать ряд, чем копаться в ассемблере. И как он потом объяснять алгоритм будет?
0
GOLDProFA
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 28
14.06.2014, 23:12  [ТС] #15
Так вы можете сделать? Не пойму при чем тут ассемблер
0
IIARTEMII
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
Завершенные тесты: 1
14.06.2014, 23:46 #16
GOLDProFA, лучшим и наипростейшим решением твоей задачи являются ряды, о которых уже написали выше, но если уж так прям хочется знать исходник, то он есть только в одном варианте:
Насколько я понял, приведённый ниже код - это Borland'овский TASM.
sinh:
Кликните здесь для просмотра всего текста

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
        include RULES.ASI
        include _MATH.INC
 
Header@
 
Data_Seg@
 
ExtSym@         _huge_dble, qword, cdecl
HUGE_VAL        equ     _huge_dble@
 
Data_EndS@
 
Code_Seg@
 
Func@   sinh, _EXPFUNC, _RTLENTRY, <double x>
Locals@ <double temp>
 
        Link@   ebx
 
        FLD1
        mov     ax, 7FFFh
        FCHS                    ; TOS = -1.0, used in FSCALE later
        mov     dx, x [6]
        and     ax, dx          ; select exponent and most signif. bits
 
        FLD     x.double
        cmp     ax, 4086h
        jnb     sinh_tooBig     ; exp (+-710.475) is the limit
 
        FABS
        cmp     ax, 3FD6h
        jb      sinh_small
 
sinh_justFits:
        f87     Exp
 
        FLD1
        FDIV    st, st(1)       ; Exp (-x)
        FSUBP   st(1), st
        FSCALE                  ; sinh (x) = (exp(x) - exp(-x)) / 2
 
sinh_end:
        fstp_st1                ; discard the -1
 
; change sign if original argument was negative
 
        test    dh, 80h
        jz      sinh_end2
        FCHS
sinh_end2:
        Unlink@ ebx
        Return@
 
sinh_tooBig:
        ja      sinh_over
        cmp     W0 (x [4]), 33CEh
        jb      sinh_justFits
 
sinh_over:
        FSTP    ST(0)                   ; discard ST and ST(1)
        FSTP    ST(0)
 
;       return  __matherr (OVERFLOW, "sinh", &x, NULL,
;                                                (_DX & 0x8000) ? - HUGE_VAL : HUGE_VAL);
 
        FLD     HUGE_VAL.double
        test    dh, 80H
        jz      sinh_temp
        FCHS
sinh_temp:
        FSTP    temp.double
 
        matherr OVERFLOW, sinh, x, NULL, temp
        jmp     sinh_end2
 
sinh_small:
        cmp     ax, 3DE0h
        jb      sinh_end                ; x tiny, return x
 
        FLDL2E
        FMUL
        F2XM1
; TOS = y = exp(x) - 1
        FLD1
        FADD    st(0),st(1)
; stack = 1+y,y,-1
        FDIVR   st(0),st(1)
        FADD
        FSCALE
        jmp     sinh_end;
 
EndFunc@ sinh
 
Code_EndS@
        end


cosh:
Кликните здесь для просмотра всего текста

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
        include RULES.ASI
        include _MATH.INC
 
Header@
 
Data_Seg@
 
ExtSym@         _huge_dble, qword, cdecl
HUGE_VAL        equ     _huge_dble@
 
Data_EndS@
Code_Seg@
Func@   cosh, _EXPFUNC, _RTLENTRY, <double x>
 
        Link@   ebx
 
        FLD1
        mov     ax, 7FFFh
        FCHS                    ; TOS = -1.0
        and     ax, x [6]       ; select exponent and most signif. bits
 
        FLD     DOUBLE (x)
        cmp     ax, 4086h
        jnb     cosh_tooBig     ; exp (+-710.475) considered too large
        cmp     ax, 3F20h
        jb      cosh_tiny
cosh_justFits:
 
        f87     Exp
 
        FLD1
        FDIV    st, st(1)       ; Exp (-x)
        FADDP   st(1), st
        FSCALE                  ; cosh (x) = (exp(x) + exp(-x)) / 2
        fstp_st1
 
cosh_end:
        Unlink@ ebx
        Return@
 
cosh_tooBig:
        ja      cosh_over
        cmp     W0 (x [4]), 033CEh
        jb      cosh_justFits
 
cosh_over:
 
        FSTP    ST(0)                   ; pop two items off the stack
        FSTP    ST(0)
 
;       return __matherr (OVERFLOW, "cosh", &x, NULL, HUGE_VAL);
 
        matherr OVERFLOW, cosh, x, NULL, HUGE_VAL
        jmp     short   cosh_end
 
;  cosh is more accurately calculated by the polynomial
;
;        (1 + x^2/2)
;
;  when x is tiny (|x| < 2^-13).
 
cosh_tiny:
        FMUL    ST(0), ST(0)
        FSCALE                  ; divide by 2
        FSUBRP  ST(1), ST(0)    ; +1 == - (-1)
        jmp     short   cosh_end
 
EndFunc@ cosh
Code_EndS@
        end


Как бы exp() там есть. Повторюсь - ряды и только ряды. На просторах интернета даже готовый код есть по первой ссылке гугля. Надеюсь помог, удачи
0
GOLDProFA
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 28
15.06.2014, 00:17  [ТС] #17
Нету готового кода, я не нашел. Как это в си перевести?
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
15.06.2014, 08:47 #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#define EPS 0.001
double sh(const double &x)
{
    double res = 0;
 
    double x_prod = x;
    int n_prod = 1;
 
    double x2 = x * x;
    double tmp1 = 2;
    double tmp2 = 3;
 
    while (true)
    {
        double d = x_prod / n_prod;
 
        if (d < EPS) break;
 
        res += d;
 
        x_prod *= x2;
        n_prod *= tmp1 * tmp2;
 
        tmp1 += 2;
        tmp2 += 2;
    }
 
    return res;
}
double ch(const double &x)
{
    double res = 0;
 
    double x_prod = 1;
    int n_prod = 1;
 
    double x2 = x * x;
    double tmp1 = 1;
    double tmp2 = 2;
 
    while (true)
    {
        double d = x_prod / n_prod;
 
        if (d < EPS) break;
 
        res += d;
 
        x_prod *= x2;
        n_prod *= tmp1 * tmp2;
 
        tmp1 += 2;
        tmp2 += 2;
    }
 
    return res;
}
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
15.06.2014, 10:34 #19
http://www.netlib.org/fdlibm/
1
GOLDProFA
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 28
15.06.2014, 21:33  [ТС] #20
Не работает, выдает ошибки.
0
15.06.2014, 21:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2014, 21:33
Привет! Вот еще темы с решениями:

Как получить исходный код *.exe или отредактировать его исполняемый код?
Собственно возможно ли декомпилить его так, чтобы можно было потом обратно...

Не работают функции <math.h> в методе (функции-члене)
Сделал программу которая решает по формуле задачу. Все работает, но стоило...

Нужен исходный код, исходник функции strcat()
Мне нужен исходный код,исходник функции strcat(); , которая в string.h...

Как использовать функции System.Math без указания библиотеки
Необходимо писать большие формулы, включающие синусы и косинусы. Написал-забыл...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru