Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать мат функции быстрее, чем в Delphi? Можно ли такое сделать 
:(
    Опции темы
Grol
Дата 29.4.2006, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Значит суть вопроса в следующем: В Delphi есть математические функции (Exp, Ln...). Эти функции очень точно вычисляются и, если организовать цикл например на 100000 итераций, на каждой итерации будет вычисляться Exp(), то это будет достаточно длительно.  Мне точность большая не нужна! И я написал функцию, которая вычисляет возведение экспоненты в степень, с небольшой точностью, но как показало время - она выполняется быстрее, чем через функцию Delphi Exp(). 
Вот эта функция:
Код

const ExpValue=2.7182818284590452353602874713527;

function ExpEx(Exponent: Double): Double;
var
  Cel:   Integer;
  ExpX:  Double;
begin
Result:=1;
if (Exponent>1) or (Exponent<-1) then
  begin
  Cel:=Trunc(Exponent);
  Exponent:=Exponent-Cel;
  Result:=IntPower(ExpValue,Cel);
  end;
if (Exponent>=-1) and (Exponent<0) then
  begin
  Exponent:=Abs(Exponent);
  ExpX:=Exponent*Exponent;
  Result:=Result/(1+Exponent+ExpX/2+(ExpX*Exponent)/6{+(ExpX*ExpX)/24});
  Exit;
  end;
if (Exponent>0) and (Exponent<1) then
  begin
  ExpX:=Exponent*Exponent;
  Result:=Result*(1+Exponent+ExpX/2+(ExpX*Exponent)/6{+(ExpX*ExpX)/24});
  Exit;
  end;
end;


Может кто-то знает, как еще быстрее организовать эту функцию, например превратить код Delphi в Asm.
А, да меня еще интересует функция Ln(), также как Exp(), как ее можно быстрее организовать, опять же мне большая точность не нужна.
Заранее большое всем спасибо за предоставленную информацию и ответы. 
--------------------
Живи так, как будто тебе предстоит умереть завтра...Учись так, как будто тебе предстоит жить вечно.........
PM MAIL ICQ   Вверх
Sunvas
Дата 29.4.2006, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

Репутация: 28
Всего: 89



Цитата(Grol @  29.4.2006,  06:20 Найти цитируемый пост)
 например превратить код Delphi в Asm.

Ну, я думаю, что быстрее ассемблера реализации не найти. В интерненет есть очень много решений твоей проблемы и именно на ассемблере.. Ищи. 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Snowy
Дата 29.4.2006, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Grol @  29.4.2006,  06:20 Найти цитируемый пост)
Может кто-то знает, как еще быстрее организовать эту функцию, например превратить код Delphi в Asm.
Зачем его переводить? Он и так на асме:
Код
procedure       _EXP;
asm
        {       e**x = 2**(x*log2(e))   }
        FLDL2E              { y := x*log2e;      }
        FMUL
        FLD     ST(0)       { i := round(y);     }
        FRNDINT
        FSUB    ST(1), ST   { f := y - i;        }
        FXCH    ST(1)       { z := 2**f          }
        F2XM1
        FLD1
        FADD
        FSCALE              { result := z * 2**i }
        FSTP    ST(1)
end;
 
PM MAIL   Вверх
Grol
Дата 30.4.2006, 06:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо всем за ответы. Я понимаю, что функции Exp и Ln в Delphi уже на asm. Но они вычисляются с большой точностью, а мне это не нужно, как я уже говорил в предыдущем моём посте. И написанная мной функция вычисляется быстрей, чем стандартная Delphi, так как я не придерживаюсь большой точности. 
--------------------
Живи так, как будто тебе предстоит умереть завтра...Учись так, как будто тебе предстоит жить вечно.........
PM MAIL ICQ   Вверх
Grol
Дата 30.4.2006, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Извините конечно меня за наглость и ламерство....но я поискал по инету, что-то по Exp и Ln я ничего не нашел. Помогите пожалуйста с решением проблемы. Наверняка кто-то уже находил или делал сам самое быстрое возведение экспоненты в дробную степень и нахождение натурального логарифма от дробного аргумента. Еще раз извиняюсь за мое ламерство....всех благодарю за помощь. 
--------------------
Живи так, как будто тебе предстоит умереть завтра...Учись так, как будто тебе предстоит жить вечно.........
PM MAIL ICQ   Вверх
Snowy
Дата 30.4.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Grol @  30.4.2006,  06:10 Найти цитируемый пост)
И написанная мной функция вычисляется быстрей, чем стандартная Delphi, так как я не придерживаюсь большой точности. 
Потестил.
Стандартная Exp работает в 2 раза быстрее.
В моем тесте вычисления прошли за 23 сек. А по твоей функции за 43.
Хотя говорить о скорости алгоритма сложно - Exp использует вычисление с плавающей точкой процессора. Так что тут показатель очень зависит от процессора.
Я тестил на CeleronM 1.4. 
PM MAIL   Вверх
Grol
Дата 30.4.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А как все таки сделать так, чтоб Exp и Ln выполнялись быстрее?  smile  
--------------------
Живи так, как будто тебе предстоит умереть завтра...Учись так, как будто тебе предстоит жить вечно.........
PM MAIL ICQ   Вверх
Snowy
Дата 30.4.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Поставить процессор помощнее.
По другому никак.
Элементарные инструкции не сократишь.
Снижение точности тут никакой роли не сыграет.
Для процессора это биты. А больше или меньше точность - битов останется столько же. 
PM MAIL   Вверх
Grol
Дата 30.4.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я когда говорю про точность имею ввиду, что Exp или Ln можно разложить в ряд, например Макларена. И процессор будет иметь дело с простейшими арифметическими операциями., кстати там и можно контролировать точность, закрепив в ряде определенное количество слагаемых. Просто я не знаю Asm, а так, еслиб знал, может быть сам реализовал. Значит никто не знает как решить мой вопрос?!  smile  smile  smile  
--------------------
Живи так, как будто тебе предстоит умереть завтра...Учись так, как будто тебе предстоит жить вечно.........
PM MAIL ICQ   Вверх
Wing
Дата 30.4.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Grol @  30.4.2006,  06:10 Найти цитируемый пост)
Но они вычисляются с большой точностью, а мне это не нужно, как я уже говорил в предыдущем моём посте.

Ну тогда пользуйся обычными операциями с Integer. Они и выполняются быстрее. 
PM MAIL ICQ   Вверх
zalex
Дата 30.4.2006, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Господа, а можно я вопрос задам?
Каким образом функция, вычисление которой, если я не ошибаюсь, АППАРАТНО встроено в сопроцессор может работать медленнее своей эмуляции на процессоре? Или дело в точности? 
PM MAIL   Вверх
Sunvas
Дата 1.5.2006, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

Репутация: 28
Всего: 89



Цитата(zalex @  30.4.2006,  23:00 Найти цитируемый пост)
Или дело в точности? 

Да, дело в точности. 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Grol
Дата 1.5.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А вот например у меня есть, алгоритм (новый) возведения экспоненты в степень, его кто-нибудь может в Asm перевести:
Код

function ExpEx(StepenExp: Double): Double;
var
  ExpX:  Double;
begin
ExpX:=Sqr(StepenExp);
Result:=1+StepenExp+ExpX/2+(ExpX*StepenExp)/6+Sqr(ExpX)/24;
end;


А перед тем как использовать эту функцию просто необходимо определить знак степени, т.е. отрицательная степень или нет. Так как, если степень экспоненты отрицательная ряд сходится медленнно.

Пример: 
Код

If Stepen<0 then 
   Res:=1/ExpEx(-Stepen)
   else
   Res:=ExpEx(Stepen);


Тогда больше мне уже ничего будет не нужно, т.к. я понимаю если это перевести в Asm, то работать это будет быстрее.   

Это сообщение отредактировал(а) Grol - 1.5.2006, 13:11
--------------------
Живи так, как будто тебе предстоит умереть завтра...Учись так, как будто тебе предстоит жить вечно.........
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


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

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


 




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


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

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