На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
В этом разделе можно создавать темы, которые относятся к поколению 32-битных компиляторов.
Здесь решаются вопросы портирования кода из старого доброго Турбо Паскаля в FPC, TMT, VP, GPC компиляторы, а также особенностей программирования на них для Windows/Linux и других ОС.
Указывайте тип компилятора, его версию, а также платформу (Windows/Linux/..) компиляции, другими словами, Target.
Модераторы: volvo877
  
> Функция fratan. компилятор TMT Pascal 3.9
    Есть такая функция сопроцессора fratan. Вычесляет arctan. Инфа в книжке по этой функции есть, а сам ТМТ Паскаль такой функции не знает.  :(
    Хотелось бы узнать почему.
    Или может она как-то по -другому называется у ТМТ?! {хотя врядли мне кто ответит на этот    вопрос).
      У сопроцессора есть fpatan, а не fratan, но это не важно, потому как в TMT Pascal'е/TP/BP эта функция называется arctan и она прекрасно работает ;)
        Да видимо в учёбнике по ассму опечатка. Не fratan, а fpatan!
        arctg - то - arctg, но мне нужно скорость. А функцию arctg во вставке ассемблера не используешь. Да и тормозней будет вызывать эту процедуру.
          А обычно arctan в постоянных вычислениях асма не используют.
          Делают так:
          Создают таблицу значений арктангенса, для всех углов. Скажем из 360 значений. Можно точнее - из 640 значений.
          И при получении угла пользуются этой таблицей. Углы естественно задаются целочисленной цифрой.
          Да. Так же значения arctan тоже не делают Real типа.
          В таблицах записывают каждое значение умножая на точность.
          Скажем 1.234 запишут как 1234 (умножив на 1000) а потом уже при необходимости получить значение берут его из массива и делят на 1000. Всё равно точность в большинстве случаев округляется до целой (скажем при выводе пикселей в координатах, зависящих от точности)
            Используй...
            ExpandedWrap disabled
              {$N+,E-}
              Var X: Double;
              Begin
                 X := Arctan(X)
              End.
            и будет всё быстро (ну... может, кроме первого прохода :))

            Ну, если ты хочешь совсем быстро, сделай так:
            ExpandedWrap disabled
              {$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.
            хотя он (Паскаль) их всё-равно на int 35h/int 39h исправляет, гад... но это только на первый проход ;)
              Про то как она работает я уже понял. Учебничек почитал. Я не понял, а что ты там говорил про int 35h?
                У тебя учебник Юрова? :) Там глюк (там вообще очень много глюков).
                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-}) :)
                Сообщение отредактировано: 7in -
                  Да у меня учебник Юрова! Пользуюсь им за неимением другого и неочотой покупать другой.  ;D
                  С fpatan я уже разобрался. А за дополнительную инфу про int3.. большое спасибо!
                   З.Ы. Я сомневаюсь, что сейчас еще остались компы, на которых нет мат сопроцессора.
                    Всякое бывает :)
                    Всё-таки по возможности (из этических соображений :)) нужно стараться делать проги так, чтобы они работали... если не на 8086 или 80286, то уже на 80386 точно (и то в последнем случае выдавать сообщение для 8086..80286, а не вешать комп) :). А требовать наличия сопроцессра, если иначе сделать нельзя :)
                    Но это чисто моя точка зрения :)
                    Сообщение отредактировано: 7in -
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0345 ]   [ 16 queries used ]   [ Generated: 8.09.24, 00:59 GMT ]