C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Asm, Co-processor
exp
Отправлено: 14.05.2004, 22:42


Мастер участка

Группа: Участник
Сообщений: 304



Здрасте всем.
И снова извечный асм..... на этот раз сопроцессор заставил призадуматься. sad.gif
Итак. объясните, почему инструкция fsin не пашет.
Работаю в tasm'е. Он пишет "Illegal instruction with current cpu settings".
Я пробовал писать в начале .287 .387 и т.д. Результат один.
Помогите пожалуйста!
Георгий
Отправлено: 14.05.2004, 23:41


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



а основной процессор не забыл указать?
CODE
.386
.387

exp
Отправлено: 15.05.2004, 09:10


Мастер участка

Группа: Участник
Сообщений: 304



Забыл... wink.gif , тьфу... попробую.
exp
Отправлено: 18.05.2004, 22:28


Мастер участка

Группа: Участник
Сообщений: 304



Попробовал...
CODE

.386
.387

Мгновенно высыпалась куча ошибок, связанных по всей видимости с огранияниями на 80386. Но не это меня поразило. Инструкция FSIN по прежнему оставалась Illegal.
Пожалуйста, помогите, напишите код вычисления синуса. (никогда бы не подумал, что кгда-нибудь попрошу подобное smile.gif )

Да, забыл сказать. .587 и .586 также не дали к результата, как впрочем и .486 ....

Отредактировано exp — 18/05/2004, 23:43
Георгий
Отправлено: 24.05.2004, 22:34


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



извини, что так долго — то забывал, то времени не было.
набрал для проверки вот такой код:
CODE
.386
.387
.model small
.stack 100h
.code
...
finit
fsin
...

нормально скомпилировался
QUOTE
tasm lab2.asm
tlink /Tde lab2.obj

но линковаться не стал — редактор связей обнаружил 32х битную инструкцию и послал меня куда подальше. smile.gif
помню, что 3 года назад как то делал комки с набором инструкций пня, но не помню как sad.gif
exp
Отправлено: 24.05.2004, 22:50


Мастер участка

Группа: Участник
Сообщений: 304



Кстати насчет 32-х битной инструкции и меня на 3 координаты посылал тасм smile.gif . У меня все симптомы такие же, что и ты написал
Но у меня еще теплится надежда. У одногруппника видел код в котором только и делается, что вычисляется 1 синус. Если найду и проверю на работоспособность — выложу. НУ ОЧЕНЬ МЕНЯ ЭТО ЗАДЕЛО!!!!!!
biggrin.gif
Георгий
Отправлено: 26.05.2004, 00:39


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



нашёл в чем дело:
CODE
.model small
.386
.387
.stack 100h
.code
start:


надо сначала указать модель памяти, а потом процессоры
exp
Отправлено: 26.05.2004, 00:45


Мастер участка

Группа: Участник
Сообщений: 304



Ну это комок. А как быть в случае экзешника?
klen
Отправлено: 26.05.2004, 01:03


Машинист паровоза

Группа: Участник
Сообщений: 239



К делу вестимо не отностся, но ради интереса попробовал на соцпросе посчтать синус, 32 битный режим, все работает.

CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 float angle = 3.14 / 2;
 float res = 0;
 asm
  {
   fld   angle
   fsin
   fstp  res;
  }
}


в результате rеs = 0.9999997 (что весьма справедливо)

Чесно говоря, привык к конфетке асму фантик в виде билдера использовать. инь и янь однако

PS. Так, на всякий случай ...
exp
Отправлено: 26.05.2004, 01:12


Мастер участка

Группа: Участник
Сообщений: 304



Согласен. Но прога моя (курсач по асму) делалась под дос со всеми вытекающими последствиями.
Из-за этой проклятой тригонометрической функции пришлось отказаться от красивой траектории перпендикулярных колебаний
CODE

x(t) = A1*sin(w1*t)    
y(t) = A2*cos(w2*t)

и заменить их на упругий отскок. sad.gif(. Курсач лежит в предыдущей теме с заголовком ASM
klen
Отправлено: 26.05.2004, 01:40


Машинист паровоза

Группа: Участник
Сообщений: 239



Ну если тебе нужно синус посчитать могу тебе алгоритм дать (секрктный естественно, тсссс!!!! в ракетах его применяем, чтоб антенну бортового локатора повернуть, там такие ЭВМища — только так и посчитать можно это гребанный синус) без соцпроса посчитать с достатосной точностью (не ряды тейлора и иже с ними).

CODE

double fast_cos(const double x)
{

// максимальная абсолютная ошибка = 2.3082e-09 !!!!


double x_sqr = x*x;
double res = double(-2.605e-07);
res *= x_sqr;
res += double(2.47609e-05);
res *= x_sqr;
res -= double(1.3888397e-03);
res *= x_sqr;
res += double(4.16666418e-02);
res *= x_sqr;
res -= double(4.999999963e-01);
res *= x_sqr;
res += 1;
return res;
}


называе это хитрожопая апроксимация косинуса на случай когда бортовой вычислитель на лампах собран а не на Пентиумах и Отеронах с ТСМами. Как из сосинуса синус сделать думаю школьного образовани яхватит smile.gif

Клянусь что данное шаманство(только на прервый взгляд) без сопроцессора употребляю, и буду так делать в предь когда доступны операции лишь сложения и умножения.

Удачи.

Отредактировано klen — 26/05/2004, 02:48
Георгий
Отправлено: 26.05.2004, 11:20


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



klen
шутник.
твоё шаманство очень напоминает заурядное разложение в ряд маклорена (тот же тейлор, но в нуле).

exp
можно и комок:
CODE
.model tiny
.code
.386
.387
org 100h
start:
         finit
         fsin;
         ret
end start
klen
Отправлено: 26.05.2004, 21:50


Машинист паровоза

Группа: Участник
Сообщений: 239



klen
шутник.
твоё шаманство очень напоминает заурядное разложение в ряд маклорена (тот же тейлор, но в нуле).
exp

Невнимательно батенька код смотрели, весма бегло. Поясню в чем тут собака.

То что вы имеете в виду суть выражение:
cos(x) = 1 — (1/2)x^2 + (1/24)x^4.......+O(x^..)

В коде реализовано совсем не ряд!!!!!
cos(x) = ((((k1 x^2 + k2)x^2 + k3)x^2 + k4)x^2 + k5) + 1

А это совсем другая запись — суть СВЕРНУТЫЙ ряд, вот решить задачу получения коэф k1, k2....... и есть шамански процесс.

Нетрудно убедится что вторая запись эффективней в ~1,5 раза чем просто ряд в вычислительном плане — имеется ввиду сходимость метода


Отредактировано klen — 27/05/2004, 00:11
Георгий
Отправлено: 27.05.2004, 10:02


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



математика:
CODE
f=((((-k1*x^2+k2)*x^2-k3)*x^2+k4)*x^2*-k5)*x^2+1=
=(раскрываем скобки)=
=1-k5*x^2+k4*x^4-k3*x^6+k2*x^8-k1*x^10
отсюда вывод — это точная копия тейлора, причём Ki это такие же числа, как в тейлоре, но записанные начиная не с 1го, а с последнего.

кодирование:
обычно ряд тейлора реализуют вот так:
CODE
const double pow_x=x*x;
double local_x=1;
double res=1;
for( int i=0; i<N; ++i )
  {
  local_x*=pow_x;
  res+=k[i]*local_x;
  };
или, если развернуть:
CODE
const double pow_x=x*x;
double local_x=pow_x;
double const * k = koeff;
double res=*(k++)*local_x;
local_x*=pow_x;
res+=*(k++)*local_x;
local_x*=pow_x;
res+=*(k++)*local_x;
local_x*=pow_x;
res+=*(k++)*local_x;
local_x*=pow_x;
res+=*(k++)*local_x;
local_x*=pow_x;
res+=*(k++)*local_x;

klen
Признаю — твой вариант имеет на одно умножение меньше и, в общем случае, работает быстрее. Но, если учесть современный FPU, то окажется, что выигрыш по скорости составит 1-4 такта на элемент, при общем времени 40-70 тактов на элемент т.е. 1-10% выигрыш по скорости.

Так что и 1.5 раза не совсем 1.5 раза, а всего лишь 1.1, да и то в лучшем случае
, да и алгоритм не такой уж секретный, да и коэффициэнты рассчитываются очень просто
CODE
const int size=10;
double k_t[size];
double k_k[size];
double last_elem = 1;
int i;
for (i=0; i<size; ++i)
   {
   last_elem*=i+2;
   k_t[i]=1/last_elem;
   };
for ( i=0;i<size; ++i)
   {
   k_k[i]=k_t[size-i-1];
   }
в результате в массиве k_t — коэффициенты тейлора, а в k_k коэффициенты для свёрнутого тейлора.

PS. правда на машинах, где нет конвеерного FPU, свёрнутый тейлор будет работать в 1.5 раза быстрее.
klen
Отправлено: 27.05.2004, 10:16


Машинист паровоза

Группа: Участник
Сообщений: 239



Я как раз и мел ввиду ситуацию когда нет сопроцессора. (в моей задаче, которая решалась, вычислитель только складывать и умножать умел и была ловля милисикунд, лучше чем ето не получилось)

А секретным я его назвал потому что низнал я такого финта(чисто вычислительного плана) ранее, а хитрожопым потомучто такая запись ряда не из чего не следует — тут надобыло догадаться!

Георгий, эко Вас ряды задели то:), наверно больную тему затронул?
Удачи.

Отредактировано klen — 27/05/2004, 11:29
Георгий
Отправлено: 27.05.2004, 21:53


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



klen
Расслабся — меня завела только повышенная "эксклюзивность" этого трюка

Слушай басню:
месяца 2 назад челу поручили сделать набор функций для гармонического анализа, вместе с обвязкой — ну там связь с другими программами, пользовательскими модулями, драйверами и т.п.
где то 1-2 недели назад узнал что быстрое преобразование фурье у него даёт погрешность ~5-10% и выполняется за ~30 000 тактов на канал (~25мкс)
сегодня был разнос — оказалось, что быстрое преобразование у него отличается от не быстрого только тем, что коэффициенты посчитаны заранее, более того есть жёсткая привязка к частоте в 50 Гц — одним словом не програмный продукт, а какая то поделка в стиле школьноков или студентов первого года обучения — в духе "что то работает вот и ладно"

морель сей басни:
таким как ты, да и многим другим участникам форума надо памятник ставить при жизни — именно за то, что фигнёй не страдают.

Спасибо этому челу с работы, что он напомнил мне о существовании куда более грубых ошибок и недомолвок, чем та ерунда, изза которой я к тебе привязался.

извини [b]klen[b/] за резкость предыдущего поста.

PS. лучше меня на "ты" называть
klen
Отправлено: 27.05.2004, 23:02


Машинист паровоза

Группа: Участник
Сообщений: 239



2_Георгий.

БПФ — как много в этом звуке, ужасного для БЦВМ слилось.....
Расфильтровка радиолокационного сигнала — что щас что 50 лет назад была головной болью. Вычислители просто умирают. Нету блин у нас вычислительных средств (я имею ввиду то что на борт самолета поставить можно). Поэтому наиполнейше понимаю и басню и мораль, только это не басня:) у нас тоже такое бывает, переделываем код, воспитываем, и меня иногда воспитывают:). Ни помню не одного случая чтоб при первом испытании прошитой железяки косяки не вылезли. Все по заднице получают.

Памятников мне не надо — я еще молодой.
exp
Отправлено: 27.05.2004, 23:07


Мастер участка

Группа: Участник
Сообщений: 304



Ой как жаль, что меня в нете не было!!!! Сколько веселья я пропустил!!!
klen спасибо за прикол с рядом. я тоже кого-нить наколю.
biggrin.gif biggrin.gif biggrin.gif
С синусом я еще подолблюсь, то бумаю тему нужно уже закрывать. Зачет все равно уже получил. biggrin.gif
А вот на счет шаманства.
1) предел программерского шамаства!!!! Недавно слышал о крэке, который взламывал экзешник только при включенном синем скине Windows XP

2) А вот еще. Это уже собственными глазами видел!!!
Прога, писанная в Delphi 8 с компонентом Media player, не играла авишку, когда мы меняли в Label->Caption хотя бы 1 символ.
Я в тот день на секунду перестал верить в мощь человеческого разума.
biggrin.gif
klen
Отправлено: 27.05.2004, 23:22


Машинист паровоза

Группа: Участник
Сообщений: 239



QUOTE (exp @ 28/05/2004, 00:09)
Я в тот день на секунду перестал верить в мощь человеческого разума.

В свое время Альберт Энштейн сказал : "Я знаю только две бесконечные вещи — вселенная и человеческая глупость", а потом добавил "В прочем на счет первой я весьма сомневаюсь..."

Так что шаманство произростает на почве обильно политой невежеством. Можно предложить 1001 присину как строка в Edit'е влияет на проигрование ролика.

Мужики, не знаю как вы но я точно уверен — написать сложную не глючущую программу под глючный проц который работает под управлением глючной ОС — невозожно

Теперь моя очередь басню расказывать:):

прелюдия

ПРИНОСЯТ ВЫЧИСЛИТЕЛЬНЫЙ МОДУЛЬ (ТОКА ЧТО СПАЯННЫЙ, ТЕПЛЕНЬКИЙ:)) ВТЫКАЮТ ЕГО , ТЫ ГРУЗИШЬ В НЕГО СВОЮ ДОЛБАННУЮ ПРОГРАММКУ ...........И НИХЕРА НЕРАБОТАЕТ, ТЫ И ТВОИ ДРУЗЗЯ ТРАХАЮТСЯ НЕДЕЛЮ С 10 КИЛОБАЙТАМИ КОДА............ВСЕРАВНО НЕРАБОТАЕТ!!! СРОКИ КОНЧАЮТСЯ, 23:00 — РАБОЧИЙ ДЕНЬ НЕ КОНЧАЕТСЯ, И КОГДА ТЫ, ТВОИ ДРУЗЗЯ И ТВОЙ НАЧАЛЬНИК УЖЕ МЫЛО И ВЕРЕКУ В СТОЛ ПОЛОЖИЛИ И ПОГЛЯДЫВАЮТ НА ПОТОЛОК, ПРИБЕГАЕТ С 4 ЭТАЖА ПРОЕКТИРОВЩИК И ГОВОРИТ — МЫ ТУТ ОШИБОЧКУ В КРИСТАЛЛЕ ОБНАРУЖИЛИ — ЯЧЕЙКА ОЗУ 0xXXXX НЕСТАБИЛЬНО РАБОТАЕТ.....НУ ЕЩЕ И ЯЧЕЙКА 0xXXXY.....ВСЕ ПРЕХОДЯТ В СОСТОЯНИЕ ПРОСРАЦИИ.....ДАЛЕЕ ВСЯ ТОЛПА ВИСИТ НАД ТЕРМИНАЛОМ КОТОРЫЙ ПОДКЛЮЧЕН К БЦВМ И СМОТРИТ КАК ПОД ОТЛАДЧИКОМ ПРОИСХОДИТ В ЦИКЛЕ ОБРАЩЕНИЕ К ЕТИМ ГРЕБАННЫМ ЯЧЕЙКА .......И О ЧУДО — БАГ ОБНАРУЖЕН НА X,YZ*10^100....00 ТАКТЕ ОБРАЩЕНИЯ К ЯЧЕЙКЕ........................ПРОЕКТИРОВЩИК ПУЛЕЙ ВЫЛЕТАЕТ ИЗ КОМНАТЫ И БЕЖИТ НА СВОЙ СПАСИТЕЛЬНЫЙ 4 ЭТАЖ КРИЧА "РЕБЯТА НЕ БЕЙТЕ — МЫ УЖЕ ИСПРАВЛЯЕМ...", А ЗА НИМ ВЕСЬ ТРЕТИЙ — РАЗМАХИВАЯ ВЕРЕВКАМИ КАК АРКАНАМИ И НЕ НИСКОЛЬКО НЕ СОМНЕВАЯСЬ КУДА ОНИ ЗАСУНУТ ЕМУ МЫЛО ЕСЛИ ПОЙМАЮТ.

А ВОТ НАСТОЯЩЕЕ ШАМАНСТВО

ситуация спусти некоторое время. Все сидяи вместе — инженеры програмисты технологи, даже операторы паяльной станции ..... и думают как написать программу чтоб 46 ножка процессора грелась на 2 градуса меньше и не мешала этим работать шине, а то у нее задержки плывут .....

Отредактировано klen — 28/05/2004, 00:47

Вернуться в Вопросы программирования в C++Builder