![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.58.89] |
![]() |
|
Сообщ.
#1
,
|
|
|
Есть такая функция сопроцессора fratan. Вычесляет arctan. Инфа в книжке по этой функции есть, а сам ТМТ Паскаль такой функции не знает. :(
Хотелось бы узнать почему. Или может она как-то по -другому называется у ТМТ?! {хотя врядли мне кто ответит на этот вопрос). |
Сообщ.
#2
,
|
|
|
У сопроцессора есть fpatan, а не fratan, но это не важно, потому как в TMT Pascal'е/TP/BP эта функция называется arctan и она прекрасно работает
![]() |
Сообщ.
#3
,
|
|
|
Да видимо в учёбнике по ассму опечатка. Не fratan, а fpatan!
arctg - то - arctg, но мне нужно скорость. А функцию arctg во вставке ассемблера не используешь. Да и тормозней будет вызывать эту процедуру. |
Сообщ.
#4
,
|
|
|
А обычно arctan в постоянных вычислениях асма не используют.
Делают так: Создают таблицу значений арктангенса, для всех углов. Скажем из 360 значений. Можно точнее - из 640 значений. И при получении угла пользуются этой таблицей. Углы естественно задаются целочисленной цифрой. Да. Так же значения arctan тоже не делают Real типа. В таблицах записывают каждое значение умножая на точность. Скажем 1.234 запишут как 1234 (умножив на 1000) а потом уже при необходимости получить значение берут его из массива и делят на 1000. Всё равно точность в большинстве случаев округляется до целой (скажем при выводе пикселей в координатах, зависящих от точности) |
Сообщ.
#5
,
|
|
|
Используй...
![]() ![]() {$N+,E-} Var X: Double; Begin X := Arctan(X) End. ![]() Ну, если ты хочешь совсем быстро, сделай так: ![]() ![]() {$N+,E-} Var X, Y: Double; Begin X := Sqrt(3)/3; Asm fld X fld1 fpatan fst Y End; WriteLn(Y*180/Pi:0:3, ' = ', Arctan(X)*180/Pi:0:3) End. ![]() |
Сообщ.
#6
,
|
|
|
Про то как она работает я уже понял. Учебничек почитал. Я не понял, а что ты там говорил про int 35h?
|
Сообщ.
#7
,
|
|
|
У тебя учебник Юрова?
![]() fpatan работает как arctan(st(1)/st(0)), а не arctan(st(0)/st(1)) Теперь про Паскаль. Он заменяет инструкции сопроцессора на команды вида int 3x + байты команды, начиная со второго. Номер прерывания зависит от первого байта команды (не считая fwait). Т.о. когда ты пишешь, например, fpatan, вместо последовательности байт 9B D9 F3 (где 9B - это fwait) компилятор Паскаля генерирует байты CD 35 F3 (т.е. int 35h + второй байт команды). Прерывание int 35h смотрит - есть ли в компе сопроцессор, и если есть, заменяет первые два байта (CD 35) на 9B D9 и передаёт управление на начало этой инструкции. Т.о, если управление попадёт на эту инструкцию ещё раз, то никаких int 35h вызываться уже не будет. Если же при вызове int 35h сопроцессора обнаружено не будет, никакой замены произведено не будет и эта инструкция будет сэмулирована программным путём (при {$E+}) или будет выдано сообщение об ошибке (при {$E-}) ![]() |
Сообщ.
#8
,
|
|
|
Да у меня учебник Юрова! Пользуюсь им за неимением другого и неочотой покупать другой. ;D
С fpatan я уже разобрался. А за дополнительную инфу про int3.. большое спасибо! З.Ы. Я сомневаюсь, что сейчас еще остались компы, на которых нет мат сопроцессора. |
Сообщ.
#9
,
|
|
|
Всякое бывает
![]() Всё-таки по возможности (из этических соображений ![]() ![]() ![]() Но это чисто моя точка зрения ![]() |