Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2009, 03:22   #11
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

Цитата:
Гм, я думаю быстрее FPU вычислить не выйдет
А как работает вот эта функция..? (Делфи7)
Код:
Const                                             //глобальные
     sin1: Double=7.61e-03;
     sin2: Double=-1.6605e-01;
     sin3: Double=1;

function ASin(fAngle:Single):Single;
asm
fld fAngle.Single
fmul fAngle.Single
fld sin1.Double
fmul st(0),st(1)
fld sin2.Double
faddp st(1),st(0)
fmulp st(1),st(0)
fadd sin3.Double
fmul fAngle
end;
Нашёл её где-то в и-нете...
Брать значения синуса из таблицы быстрее чем вызывать функцию sin() раза в два...
А этой вставкой на ассемблере получается быстрее ещё в два раза (т.е. уже в 4 раза быстрее системной функции), но результат слишком неточный...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 06.05.2009, 08:11   #12
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
В этих микрокалькуляторах был впервые применен метод вычисления элементарных функций по методу "цифра за цифрой", который стал сменил разложение в ряд Тэйлора и стал фактическим стандартом почти для всех современных калькуляторов во всем мире, кроме как у нас. В двух словах, метод "цифра за цифрой" можно отнести как к итерационным, так и к табличным. Он характеризуется простотой выполнения операций (алгебраическое сложение и сдвиг), значительным совпаданием алгоритмов для различных функций и, самое главное, достаточно высоким быстродействием и точностью вычислением. Погрешность вычислений при 8-разрядном аргументе составляет всего +- 1 в седьмом-восьмом разряде.
^ думаете так?
и все таки этот русский меня заитриговал =)
Форматируйте код, будьте людьми.

Последний раз редактировалось Granus; 06.05.2009 в 08:16.
Granus вне форума Ответить с цитированием
Старый 06.05.2009, 16:35   #13
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

FPU - сопроцессор, железяка, которая занимается вычислениями чисел с плавающей точкой. У него есть инструкция FSIN, чего она делает - знают только разработчики, там вроде применяется аппроксимация полиномом, время выполнения 150~200 тактов, точность 80 бит. Некоторые компиляторы используют ряды и SSE/3DNow-инструкции - быстрее, но точность (вроде?) меньше. Быстрее всего сгенерировать таблицу и брать всё готовое из памяти, но тогда количество значений будет ограничено

Вот быстрый пример для тангенса/котангенса с низкой точностью
Код:
program Project1;

{$APPTYPE CONSOLE}

uses SysUtils, math;

const N = 10;
var  x, x2, x3, x5, x7, tg, ctg: real;
      i: integer;

begin
  Writeln(' N |      x        tg     real tg     ctg     real ctg ');
  Writeln('---+---------------------------------------------------');

  for i:= 1 to N do
  Begin
    x  := i * (PI / N / 4);
    x2 := x * x;
    x3 := x * x2;
    x5 := x2 * x3;
    x7 := x2 * x5;

    tg  := x + 0.334961658 * x3 + 0.118066350 * x5 + 0.092151584 * x7;
    ctg := 1.0 / x - 0.332930053 * x - 0.0242168088 * x3	;

    Write(i:2,' |');
    Write(x:10:6);
    Write(tg:10:6);
    Write(tan(x):10:6);
    Write(ctg:10:6);
    Writeln((1.0 / tan(x)):10:6);
  End;
 
  readln;
end.
Код:
 N |      x        tg     real tg     ctg     real ctg
---+--------------------------------------------------
 1 |  0.078540  0.078702  0.078702 12.706235 12.706205
 2 |  0.157080  0.158389  0.158384  6.313807  6.313752
 3 |  0.235619  0.240090  0.240079  4.165370  4.165300
 4 |  0.314159  0.324934  0.324920  3.077755  3.077684
 5 |  0.392699  0.414219  0.414214  2.414271  2.414214
 6 |  0.471239  0.509511  0.509525  1.962642  1.962611
 7 |  0.549779  0.612770  0.612801  1.631852  1.631852
 8 |  0.628319  0.726530  0.726543  1.376356  1.376382
 9 |  0.706858  0.854120  0.854081  1.170823  1.170850
10 |  0.785398  0.999949  1.000000  1.000025  1.000000
пыщь

Последний раз редактировалось JTG; 06.05.2009 в 16:39.
JTG вне форума Ответить с цитированием
Старый 06.05.2009, 18:47   #14
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
любую функцию (непрерывную и дифференцируемую) можно разложить на некий степенной ряд любых непрерывно-дифференцируемых функций.
Рядов много разных: Ряды Тейлора, ряды Фурье, ряды Маклорена и т.д.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как модернизироваать калькулятор ? бедный_студент Помощь студентам 4 25.03.2009 15:00
синус Кристина1 Помощь студентам 9 13.11.2008 22:38
Обратный гиперболический синус Lofty Помощь студентам 2 07.10.2008 18:20
Косинус, синус,... Манжосов Денис :) Свободное общение 9 26.08.2008 15:59
Синус AndrewASV Общие вопросы Delphi 4 24.10.2007 13:21