Поиск:

Ответ в темуСоздание новой темы Создание опроса
> калькулятор, как считает 
:(
    Опции темы
Ch0bits
Дата 8.4.2005, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

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



Один чел на форуме про J2ME спрашивал как рассчитать arccos, arcsin, ln и тд. т.к. их нет в классе Math. Я тоже задумался над этим вопросом smile и вспомнил первый курс smile , где меня учили вычислениям через ряды. smile Открыв пыльный толмуд по моёй любимой математике, я посмотрел на формулы разложения на ряды и задался вопросом неужели нет другого пути? smile

Так вот, как же сёйчас производят вычисления cos, sin... и др. функций.
Как это делают современные калькуляторы? Как это реализовано в процессоре? smile
Неужели ряды используют до сих пор? Если так, то кто-нибудь может напомнить формулу для определения заданной точности рядов?
PM WWW   Вверх
yaja
Дата 8.4.2005, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Насколько я знаю в нормальных библиотеках строится таблица значений для sin/cos... для определенных аргументов(с достаточно маленьким шагом). При вычислении значения смотрится есть ли значение в таблице для такого аргумента, или для аргумента, sin/cos... которого не очень сильно отличается, если не находят, то ипользуя формулы sin(a+b)/sin(a-b) и тоже для cos нуходится требуемое значение.
Цитата

Как это реализовано в процессоре?

имхо тоже через таблицы smile

PM MAIL   Вверх
Ch0bits
Дата 8.4.2005, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

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



Цитата(yaja @ 8.4.2005, 18:20)
имхо тоже через таблицы

Какие таблицы??? smile smile smile Брадиса что-ли? smile
Даже если так, то откуда взялись таблицы?

PM WWW   Вверх
yaja
Дата 8.4.2005, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Что такое таблицы Брадиса не знаю smile
Ну блин, заранее посчитали эти значения, реализовали его програмно, а затем зашили в схемы smile
Если честно, я не особо вкурсе по поводу
Цитата
Как это реализовано в процессоре?


PM MAIL   Вверх
Ch0bits
Дата 8.4.2005, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

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



Цитата(yaja @ 8.4.2005, 19:42)
заранее посчитали эти значения

В том то и дело, что я хочу узнать как они посчитали, да ещё с бешенной точностью.
PM WWW   Вверх
yaja
Дата 8.4.2005, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пардон не въехал сразу smile
Цитата
да ещё с бешенной точностью.

это ты имеешь ввиду максимум 8 знаков после запятой?? smile
Ну т.к надо посчитать один раз, то можно использовать что-угодно для вычисления этих значений. Мона посчитать через ряды дающие быструю сходимость. Какие обычно используются я не знаю, но можно просто разложить функцию в ряд Тейлора и получится некоторый ряд(но наверное сходиться он будет долго). А вычисления в ряду продолжаешь до тех пор, пока получающееся значение отличается от предыдущего на нужную тебе величину(например, если нужна точность 1.e-5, то до тех пор, пока отличия составляют 5.e-6)
PM MAIL   Вверх
Ch0bits
Дата 8.4.2005, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

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



Я так и сделал. Только вот количество итераций сильно колеблется.
Код

public class Main
{
    public static void main(String[] args) 
    {
        double x=Double.parseDouble(args[0]);
        double etalon=Math.atan(x);
        //
        double y=x;
        for(double n=1;n<=100000;n++)
        {
                y+=Math.pow(-1,n)*Math.pow(x,2*n+1) / (2*n+1);
                System.out.println(y);
                if (Math.abs(etalon-y)<=0.0000001)
                {
                        System.out.println("Количество итераций "+n);
                        System.out.println("Эталонное значение функции "+etalon);
                        return;
                }
        }
        System.out.println("n>100000");
    }



Например для:
x=0.3 n=5
x=0.5 n=8
x=0.7 n=16 smile
x=0.9 n=51 smile
x=0.999 n=3311 smile
x=0.9999 n=23363 smile smile smile

Как же процессор махом вычисляет значения с точностью double? smile

Это сообщение отредактировал(а) Vadim999 - 8.4.2005, 23:29
PM WWW   Вверх
Void
Дата 9.4.2005, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Вот что я нарыл после непродолжительного гугления: CORDIC и еще о том же
COordinate ROtation Digital Computer
Суть метода:
Поворот вектора (1, 0) на угол fi, чтобы вычислить sin(fi) и cos(fi)
Поворот сводится к операциям сложения и сдвига
N итераций для точности N бит

Вот пример кода вычисления синуса и косинуса с точностью 12 бит (чуть хуже 4 знаков после запятой):
Код

// downloaded (and modified by Kia) from 
// www.execpc.com/~geezer/embed/cordic.c
#include <stdio.h>
#include <math.h>

#define    AG_CONST    0.6072529350
#define    FXD(X)          ((long int)((X) * 65536.0))

typedef long int fixed; /* 16.16 fixed-point */

static const fixed Alpha[]={ FXD(45.0),
  FXD(26.565), FXD(14.0362), FXD(7.12502),
  FXD(3.57633), FXD(1.78991), FXD(0.895174),
  FXD(0.447614),FXD(0.223811), FXD(0.111906),
  FXD(0.055953),FXD(0.027977) };

int main(void){
  fixed X, Y, CurrAngle;
  unsigned i;

  X=FXD(AG_CONST);  /* AG_CONST * cos(0) */
  Y=0;            /* AG_CONST * sin(0) */
  CurrAngle=FXD(28.027);
  for(i=0; i < 12; i++){
     fixed NewX;

     if(CurrAngle > 0) {
        NewX=X - (Y >> i);
        Y+=(X >> i);
        X=NewX;
        CurrAngle -= Alpha[i]; }
     else {
        NewX=X + (Y >> i);
        Y-=(X >> i);
        X=NewX;
        CurrAngle += Alpha[i]; 
     } // if-else
  } // for (i=…
  printf("cos(28.027)=%6.4f, sin()=%6.4f\n",
            X/65536.0, Y/65536.0);
} // main


Не берусь утверждать, что в процессорах используется именно этот алгоритм, но похоже на то.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ch0bits
Дата 10.4.2005, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

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



Реальный метод! smile Остаётся только додуматься, как сделать обратную операцию.
PM WWW   Вверх
Void
Дата 10.4.2005, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



В документе, на который я дал ссылку, коротко описывается, как получить арктангенс. Кстати, вот еще подтверждение тому, что именно этот метод используется в аппаратных реализациях - в наборе инструкций x87 из обратных тригонометрических функций только арктангенс.
Вообще, Google дал массу ссылок, например:
FAQ по CORDIC и др.

Это сообщение отредактировал(а) Void - 10.4.2005, 11:27


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


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

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


 




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


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

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