Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
#1

SinCos - C++

14.09.2009, 10:50. Просмотров 2367. Ответов 10
Метки нет (Все метки)

странно но в math.h нету SinCos'а . Попробовал переписать сам.
C++
1
2
3
4
5
6
7
8
9
10
11
typedef long double Extended;
Extended SinCos(Extended &Theta,Extended &Sin,Extended &Cos)
{
  _asm{ 
  FLD     Theta
  FSINCOS
  FSTP    tbyte ptr [edx]    // Cos
  FSTP    tbyte ptr [eax]    // Sin
  FWAIT
  }
}
не этот код падает с AV. Помогите пожалуйста исправить.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2009, 10:50     SinCos
Посмотрите здесь:

Для заданного числа х вычислить сумму одиннадцати слагаемых: Sinx + CosSinx + SinCosSinx+…+SinCos…Sinx - Pascal ABC
Для заданного числа х вычислить сумму одиннадцати слагаемых: Sinx + CosSinx + SinCosSinx+…+SinCos…Sinx На одной строке экрана...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
14.09.2009, 11:35     SinCos #2
странно но в math.h нету SinCos'а
http://www.cplusplus.com/reference/clibrary/cmath/sin/
http://www.cplusplus.com/reference/clibrary/cmath/cos/
easybudda
Эксперт CЭксперт С++
9470 / 5483 / 927
Регистрация: 25.07.2009
Сообщений: 10,508
14.09.2009, 11:40     SinCos #3
Цитата Сообщение от Adler Посмотреть сообщение
странно но в math.h нету SinCos'а . Попробовал переписать сам.
Если уж так хочется, чтоб и sin, и cos в "одном флаконе" возвращались, может так как-то сделать:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <math.h>
 
/* sincos.c */
 
void sincos(double x, double *sin_val, double *cos_val){
    *sin_val = sin(x);
    *cos_val = cos(x);
}
 
int main(){
    int x;
    double s, c;
    
    for ( x = 0; x <= 360; x += 15 ) {
        sincos((double)x, &s, &c);
        printf("Angle: %d Sin: %.4lf Cos: %.4lf\n", x, s, c);
    }
    
    return(0);
}
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
14.09.2009, 11:43     SinCos #4
Цитата Сообщение от Adler Посмотреть сообщение
е этот код падает с AV. Помогите пожалуйста исправить.
вот прототип функции sincos
не так сложно реализовать её тело
Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
14.09.2009, 11:55  [ТС]     SinCos #5
easybudda, дело не в хочеться. Просто команда FSINCOS выполняется примерно за тоже время что и Sin. Таким образом если надо и Sin и Cos от одного аргумента посчитать, то можно с экономить время раза в два. Как раз мой случай.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
14.09.2009, 12:05     SinCos #6
Цитата Сообщение от Adler Посмотреть сообщение
если надо и Sin и Cos от одного аргумента посчитать, то можно с экономить время раза в два. Как раз мой случай.
если ты заранее знаешь, какие углы будут поступать на вход, то можно их и не считать, а создать таблицу с заранее вычисленными значениями.
easybudda
Эксперт CЭксперт С++
9470 / 5483 / 927
Регистрация: 25.07.2009
Сообщений: 10,508
14.09.2009, 12:38     SinCos #7
Цитата Сообщение от Adler Посмотреть сообщение
easybudda, дело не в хочеться. Просто команда FSINCOS выполняется примерно за тоже время что и Sin. Таким образом если надо и Sin и Cos от одного аргумента посчитать, то можно с экономить время раза в два. Как раз мой случай.
Ах, в этом смысле...
вот такое нашёл:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
void __declspec(naked) __stdcall sincos(double x,double *pSin,double *pCos)
{
__asm
    {
    fld QWORD PTR [esp+4]
    fsincos
    mov eax,DWORD PTR [esp+16]
    mov edx,DWORD PTR [esp+12]
    fstp QWORD PTR[eax]
    fstp QWORD PTR[edx]
    ret 16
    }
}
Насколько работоспособно - не знаю, в сети лежало...
Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
14.09.2009, 13:35  [ТС]     SinCos #8
easybudda
мега спасибо! Круто сразу в double, а не в дурацкий extendet это даже лучше чем я хотел.

зы: приз.
Миниатюры
SinCos  
easybudda
Эксперт CЭксперт С++
9470 / 5483 / 927
Регистрация: 25.07.2009
Сообщений: 10,508
14.09.2009, 14:33     SinCos #9
Цитата Сообщение от Adler Посмотреть сообщение
это даже лучше чем я хотел.
А работает? А то у меня под рукой сейчас мак только, на нём можно и не пытаться...
Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
14.09.2009, 14:49  [ТС]     SinCos #10
easybudda
кончено работает. Проверил два раза. На скрине у 12 шариков(те что кругом выстроились) позиция задаётся как раз с его участием.
easybudda
Эксперт CЭксперт С++
9470 / 5483 / 927
Регистрация: 25.07.2009
Сообщений: 10,508
14.09.2009, 15:02     SinCos #11
Adler, ну и славненько на всякий случай:
Примечание: FSINCOS работает для аргументов в диапазоне от -2^63 до +2^63
это рядом с ней было написано. Могу прямую ссылку в личку отправить, но там потом разговор в другую сторону ушёл, по существу больше ничего и небыло...
Yandex
Объявления
14.09.2009, 15:02     SinCos
Ответ Создать тему
Опции темы

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