exp |
Отправлено: 14.05.2004, 22:42 |
|
Мастер участка
Группа: Участник
Сообщений: 304
|
Здрасте всем.
И снова извечный асм..... на этот раз сопроцессор заставил призадуматься.
Итак. объясните, почему инструкция fsin не пашет.
Работаю в tasm'е. Он пишет "Illegal instruction with current cpu settings".
Я пробовал писать в начале .287 .387 и т.д. Результат один.
Помогите пожалуйста!
|
|
Георгий |
Отправлено: 14.05.2004, 23:41 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
а основной процессор не забыл указать?
|
|
exp |
Отправлено: 15.05.2004, 09:10 |
|
Мастер участка
Группа: Участник
Сообщений: 304
|
Забыл... , тьфу... попробую.
|
|
exp |
Отправлено: 18.05.2004, 22:28 |
|
Мастер участка
Группа: Участник
Сообщений: 304
|
Попробовал...
Мгновенно высыпалась куча ошибок, связанных по всей видимости с огранияниями на 80386. Но не это меня поразило. Инструкция FSIN по прежнему оставалась Illegal.
Пожалуйста, помогите, напишите код вычисления синуса. (никогда бы не подумал, что кгда-нибудь попрошу подобное )
Да, забыл сказать. .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х битную инструкцию и послал меня куда подальше.
помню, что 3 года назад как то делал комки с набором инструкций пня, но не помню как |
|
exp |
Отправлено: 24.05.2004, 22:50 |
|
Мастер участка
Группа: Участник
Сообщений: 304
|
Кстати насчет 32-х битной инструкции и меня на 3 координаты посылал тасм . У меня все симптомы такие же, что и ты написал
Но у меня еще теплится надежда. У одногруппника видел код в котором только и делается, что вычисляется 1 синус. Если найду и проверю на работоспособность — выложу. НУ ОЧЕНЬ МЕНЯ ЭТО ЗАДЕЛО!!!!!!
|
|
Георгий |
Отправлено: 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)
|
и заменить их на упругий отскок. (. Курсач лежит в предыдущей теме с заголовком 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;
}
|
называе это хитрожопая апроксимация косинуса на случай когда бортовой вычислитель на лампах собран а не на Пентиумах и Отеронах с ТСМами. Как из сосинуса синус сделать думаю школьного образовани яхватит
Клянусь что данное шаманство(только на прервый взгляд) без сопроцессора употребляю, и буду так делать в предь когда доступны операции лишь сложения и умножения.
Удачи.
Отредактировано 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 спасибо за прикол с рядом. я тоже кого-нить наколю.
С синусом я еще подолблюсь, то бумаю тему нужно уже закрывать. Зачет все равно уже получил.
А вот на счет шаманства.
1) предел программерского шамаства!!!! Недавно слышал о крэке, который взламывал экзешник только при включенном синем скине Windows XP
2) А вот еще. Это уже собственными глазами видел!!!
Прога, писанная в Delphi 8 с компонентом Media player, не играла авишку, когда мы меняли в Label->Caption хотя бы 1 символ.
Я в тот день на секунду перестал верить в мощь человеческого разума.
|
|
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 |
|