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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2009, 15:37   #1
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию e^x в FPU

есть ли такая функция у сопроцессора? Мне надо посчитать кубический корень, (sqrt(x))^3 = exp(ln(x)/3)
еще нужен логарифм... ln
NiCola999 вне форума Ответить с цитированием
Старый 17.11.2009, 16:10   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Рекомендую достать MASM библиотеку FPULib там есть такие функции.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.11.2009, 16:13   #3
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

ln(x)=log2(x)/log2(e)
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 17.11.2009, 16:21   #4
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

ассемблер 80836, подключать ничего нельзя.

Если нету функций типо flog и fexp тогда вопрос меняется. Есть ли какая-нибудь формула кубического корня аргумента которую можно сделать c fpu

Последний раз редактировалось Stilet; 19.11.2009 в 12:58.
NiCola999 вне форума Ответить с цитированием
Старый 17.11.2009, 21:17   #5
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Вот вам ф-ция возведения в степень. Разберетесь наверно
Код:
fpower		proc
		; st0=X, st1=Y

		ftst                   ; st0=X=0 ?
		fstsw	ax
		sahf
		jz	@@Zero         ; Да, результат = 0 (CF=NC=0, кстати!)
		mov	bl,ah          ; BL and 1=1 при X<0, 0 при X>0 (исп-ся после получения результата)
		ja	@@PositiveX    ; Если X>0, то никаких проверок нам больше не надо

		fxch                   ; Обмен st0 <-> st1 (st0=Y, st1=X)
		fld	st(0)          ; st2=st1=X, st1=st0=Y, st0=st0=Y
		frndint                ; st0=Round(st0)=Round(Y)
		fcomp                  ; Сраниваем st0 и st1; st0=st1=Y, st1=st2=X, st3=пусто
		fstsw	ax             ; В AH флаг ZF=ZR=1 при целом Y
		sahf                   ; Y целое?
		jnz	@@Error        ; Нет, отрицательные числа нельзя возводить в нецелую степень!

		fld1
		fld1
		fadd                   ; st2=st1=X, st1=st0=Y, st0=2
		fld	st(1)          ; st3=st2=X, st2=st1=Y, st1=st0=2, st0=st1=Y
		fprem                  ; st0=st0 mod st1=Y mod 2
		ftst                   ; st0=0 (Y mod 2=0, т.е. чётное) ?
		fstsw	ax             ; В AH флаг ZF=ZR=1 при чётном Y (CF=NC=0, кстати!)
		fstp	st(0)          ; Удаляем остаток от деления
		fstp	st(0)          ; Удаляем число 2 (st0), st0=st1=Y, st1=st2=X, st2=пусто
		fxch                   ; Обмен st0 <-> st1 (st0=X, st1=Y)
@@PositiveX:
		fabs                   ; st0=|st0|=|X|
		fyl2x                  ; st0 = st1*log2(st0) = Y*log2(|X|)
		fld	st(0)          ; st1=st0
		frndint                ; st0=Round(st0)
		fsub	st(1),st(0)    ; st1=st1-st0
		fld1                   ; st1=st0, st0=1
		fscale                 ; st0=st0*2^st1
		fstp	st(1)          ; Удаляем st1
		fincstp                ; st7=st0, st0=st1
		f2xm1                  ; st0=(2^st0)-1
		fmul	st(0),st(7)    ; st0=st0*st7
		fdecstp                ; st1=st0, st0=st7
		fadd                   ; st0=st0+st1, st0=пусто
		; Результат в st0 !!!

		test	bl,1           ; X<0 ? (CF=NC=0, кстати!)
		jz	@@End          ; Нет, завершаем
		sahf                   ; Y чётное
		jz	@@End          ; Да, завершаем
		fchs                   ; Если X<0, а Y нечётное, то меняем знак результата
@@End:		ret                    ; Выходим!
@@Error:
		fldz                   ; Заносим 0
		fstp	st(1)          ; Удаляем X
		stc                    ; CF=CY=1 - ошибка
@@Zero:
		fstp	st(1)          ; Удаляем Y
		ret                    ; Выходим!

fpower		endp
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 17.11.2009, 22:14   #6
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

возведение в степень 1/3 нельзя, к сожалению =), есть какаято формула через логарифм не могу её найти
NiCola999 вне форума Ответить с цитированием
Старый 17.11.2009, 23:18   #7
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

Цитата:
Сообщение от NiCola999 Посмотреть сообщение
Если нету функций типо flog и fexp тогда вопрос меняется. Есть ли какая-нибудь формула кубического корня аргумента которую можно сделать c fpu
помоему вы не обратили на мой пост внимания, обидно
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 18.11.2009, 00:37   #8
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

airyashov я никак не мог пропустить ваш пост)

у меня есть сейчас такая формула
(sqrt(x))^3 = exp(ln(x)/3)
логарифм вы мне дали формулу, спасибо) для lg2(x) в фпу вроде fyl2x
осталась exp(x), может есть какаято простая формула для е(х) , очень не хочется считать каждый цикл факториал в формуле Тейлора=)

Последний раз редактировалось NiCola999; 18.11.2009 в 00:54.
NiCola999 вне форума Ответить с цитированием
Старый 18.11.2009, 08:34   #9
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

могу предложить такое, как понимаю нужно вычислить
x^(1/3)
тогда
2^(log2(x)/3), а это можно разложить на
2^целая часть(log2(x)/3)*2^остаток(log2(x)/3)
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 18.11.2009, 18:33   #10
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

не очень понял, как по этому находить корень, можно поподробнее пожалуйста
NiCola999 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с FPU NiCola999 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 14 04.11.2009 00:01