Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Самостоятельная реализация sin, cos и кв. корня


Автор: 4етырнадцатый 5.5.2008, 11:15
Люди!!!
Необходимо реализовать на чистом С(!!!) без подключения библиотек (в т.ч. math) функции синуса, косинуса (в принципе хватит одной из них), а также функцию взятия квадратного корня.
Пойдут любые алгоритмы, в т. ч. рекурсивные, итеративные и др.
Желательно вычислять с заданной точностью.

В крайнем случае можно на ассемблере.
Или дайте хотя бы описание алгоритма!!!

Огромная просьба откликнуться и помочь!!!

Автор: bsa 5.5.2008, 11:24
Воспользуйся поиском в гугле по словам "синус ряд тейлора", "косинус ряд тейлора", "алгоритм квадратного корня" и т.д.

Автор: ksili 5.5.2008, 11:29
На ассемблере есть инструкции FSIN, FCOS и FSQRT. Так что никаких алгоритмов и не надо!  smile  smile 

Только разберитесь со стеком FPU, чтобы он не переполнялся при использовании указанных функций

Автор: archimed7592 5.5.2008, 11:29
Цитата(4етырнадцатый @  5.5.2008,  11:15 Найти цитируемый пост)
Или дайте хотя бы описание алгоритма!!!

Тригонометрические ф-ции(из-за своей невычисляемой природы) считаются по таблицам.
Кв. корень - посредством итеративных приближений.

Автор: ksili 5.5.2008, 11:32
Цитата(archimed7592 @  5.5.2008,  15:29 Найти цитируемый пост)
Тригонометрические ф-ции(из-за своей невычисляемой природы) считаются по таблицам.


archimed7592, прямо в процессоре зашита таблица со значениями синусов? Дайте подтверждающую ссылку. Я не подкалываю, мне действительно интересно!

Автор: bronislav 5.5.2008, 12:10
Цитата(ksili @  5.5.2008,  11:32 Найти цитируемый пост)
archimed7592, прямо в процессоре зашита таблица со значениями синусов? Дайте подтверждающую ссылку. Я не подкалываю, мне действительно интересно!


насколько я знаю, эти функции вычисляются приблизительно (т.е. раскладываются в ряд тейлора)

Автор: Lycifer 5.5.2008, 17:03
Ну насчёт квадратного корня я тебе подскажу,а вот на счёт sin,cos думаё сам.

#define ITNUM 4

float Sqroot1(float x) {
  int sp=0,i,inv=0;
  float a,b;
  if(x<=0.F) return(0.F); // 0.F= 0 случай  если не чего считать

  if(x<1.F) 
{
  x=1.F/x;
  inv=1;
}

  while(x>16.F) 
{
sp++;
x/=16.F;
}

  a=2.F; то и есть 2

  for(i=ITNUM;i>0;i--) {
    b=x/a; a+=b; a*=0.5F;
  }
  while(sp>0) 
 {
   sp--;
   a*=4.F;}

  if(inv) a=1.F/a;

  return(a);
}
Полное описание делать не буду, ну ты же должен осознать формулу!!!! smile

Добавлено через 2 минуты и 42 секунды
да,а насчёт синусов и косинусов, я  видел как это делают через тангенс.(так что дело за малым)

Автор: Igor_K 5.5.2008, 18:03
Цитата(Lycifer @  5.5.2008,  17:03 Найти цитируемый пост)
да,а насчёт синусов и косинусов, я  видел как это делают через тангенс.(так что дело за малым)

Ага. От сцылка http://algolist.manual.ru/maths/count_fast/sincos.php

Автор: archimed7592 5.5.2008, 19:03
Цитата(ksili @  5.5.2008,  11:32 Найти цитируемый пост)
archimed7592, прямо в процессоре зашита таблица со значениями синусов? Дайте подтверждающую ссылку. Я не подкалываю, мне действительно интересно! 

Ссылку дать не могу, но, из авторитетного, на мой взгляд, источника(ixbt.com) слышал, в обзоре одного из GPU, что-то на этот счёт(про то что вычисляются по таблицам). Возможно меня подводит память, возможно сейчас уже считают по другому, а возможно я прав. В общем, гуглите и гулимы будете smile.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)