Member
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Daemon Окей, буду так делать.
Сегодня обратил внимание на страннейший глюк, из всех мной виденных. Дебажу кусок программы:
Код:
float x = point.x(); float x2 = isolines[1]->last().x(); if (point.x() == isolines[1]->last().x()) { int b=5; }
Дебаггер показывает одинаковые значения переменных x и x2 - 1504.8635. Однако условие не выполняется. Самое странное, если заменить на
Код:
float x = point.x(); float x2 = isolines[1]->last().x(); if (x == x2) { int b=5; }
переход по условию осуществляется. Вообще ничего понять не могу.
Там по условию должны точки совпадать, так вот если сравнивать координату y - все нормально, условие выполняется обеими способами, в отличие от x. Значения координат y обеих точек также равны, y=y2=3000.
kexman Не нужно сравнивать числа с плавающей запятой на равенство. Они же не точные (особенно float). У float точность порядка 7 десятичных знаков. Сравнивать нужно вычитанием: if ( (x-x2) < eps ) { ... }, причём eps должно зависеть от модуля x.
З.Ы. А отличия первого варианта от второго в оптимизации: точность сопроцессорных чисел - 80 бит, а float - 32 бит, при этом сравнение всегда осуществляется в сопроцессоре, т.е. float преобразуется к 80-битному формату, но если число уже находится в стеке сопроцессора (получено из других вычислений), то оно не преобразуется к float и назад в 80 бит, и поэтому имеет большую точность чем float и, соответственно, слегка отличающееся значение.
Member
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Билли Бонс Кстати я пользовался классом QPointF (F - означает float) библиотеки QT, там есть перегруженный оператор сравнения, дык там проверка на равенство, сорцы смотрел. Поэтому и не получалось. Придется перекомпилировать библиотеку. Добавлено спустя 2 минуты, 29 секунд Билли Бонс Тогда хочу задать вам вопрос. У меня в программе есть небольшой блок математечиских вычислений(на уровне + и *). Про процессоры в обзорах пишут постояннно, что мол, обладают технологиями mmx, sse, sse2, sse3, 3dnow(у AMD), которые позволяют ускорять вычисления. Вопрос, как это все реализовывается?
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
kexman может у тебя fast math включен, или еще какая нехорошая оптимизация, в компиляторе, посмотри.
kexman писал(а):
У меня в программе есть небольшой блок математечиских вычислений(на уровне + и *). Про процессоры в обзорах пишут постояннно, что мол, обладают технологиями mmx, sse, sse2, sse3, 3dnow(у AMD), которые позволяют ускорять вычисления. Вопрос, как это все реализовывается?
Интеловский icc компайлер умеет векторизировать код, т.е. оптимизировать его под использования sse2/sse3, мне кажется делать это вручную - неблагодарное дело.
Member
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Daemon А он денег стоит? icc? И мне отладчик к тому же в студии нравится.. Или финальную версию компилировать под icc? а работать с мелкософтовским? И сколько процентов вообще может быть прироста?
Такой аопрос появился. Есть функция
Код:
MyType* func(int a, int b, MyType *obj);
Она должна возвращать указатели на 2 объекта типа MyType. Но через параметр функции не получается, видимо он не может быть изменен. Думал как ссылку можно
Код:
MyType* func(int a, int b, MyType &(*obj));
Но не хочет. Добавлено спустя 12 минут, 37 секунд Догадался использовать MyType **obj, но в момент присвоения в функции:
Код:
MyType* func(int a, int b, MyType **obj) { .... (*obj)= указатель на объект типа MyType .... }
вылетает с Unhandled exception at 0x0040a0de in Mapper.exe: 0xC0000005: Access violation writing location 0x42f8849b.
kexman Ссылку неправильно делаешь, должно быть так:
Код:
MyType* func(int a, int b, MyType*& obj);
Эксепшен вылетает - нужно смотреть, что ты передаёшь в функцию.
По поводу MMX и SSE - они предназначены для одновременного выполнения одинаковых действий над несколькими числами (MMX, SSE - целые, а SSE2 - плавающие вроде, SSE3 - хз). Т.е. здесь в первую очередь нужен подходящий алгоритм, выполняющий потоковые вычисления, не факт, что в твоей программе это пригодится. Оптимизировать под SSE умеет и майкрософтовский компайлер. В принципе, если ты не знаешь ассемблер, то не стоит забивать голову этими SSE. Намного эффективнее оптимизировать (даже совсем чуть-чуть) алгоритм, чем переписать все умножения под SSE. Добавлено спустя 1 минуту, 16 секунд З.Ы. На Вы обращаться необязательно. Добавлено спустя 6 минут, 13 секунд По поводу оптимизации небольшой оффтопик: вчера разбирал программу одну для параллельных вычислений чего-то там, один перл оттуда просто добил:
Код:
for( i = 1; i <= ktup; ++i ) pot[i] = (int) pow( (double) 4, (double) ( i-1 ) );
Самое забавное, я так понял, что это часто используемая программа для каких-то биологических расчётов. Вот здесь исходники, я разбирал версию 0.13-2...
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
kexman писал(а):
Думал как ссылку можно
Унарные операторы, интерпритируются справо на лево, т.е.
int *b;
int *&a = b; //Ссылка на указатель
int *a[10]; //Массив указателей
int (*a)[10]; //А это указатель на массив
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения