Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 33 из 87<  1 ... 30  31  32  33  34  35  36 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

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.



Партнер
 

Member
Статус: Не в сети
Регистрация: 24.12.2005
kexman Не нужно сравнивать числа с плавающей запятой на равенство. Они же не точные (особенно float). У float точность порядка 7 десятичных знаков. Сравнивать нужно вычитанием: if ( (x-x2) < eps ) { ... }, причём eps должно зависеть от модуля x.

З.Ы. А отличия первого варианта от второго в оптимизации: точность сопроцессорных чисел - 80 бит, а float - 32 бит, при этом сравнение всегда осуществляется в сопроцессоре, т.е. float преобразуется к 80-битному формату, но если число уже находится в стеке сопроцессора (получено из других вычислений), то оно не преобразуется к float и назад в 80 бит, и поэтому имеет большую точность чем float и, соответственно, слегка отличающееся значение.


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Билли Бонс
И откуда вы все это знаете? :)
Спасибо большое за помощь! Очень благодарен)


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
kexman писал(а):
И откуда вы все это знаете?
Много лет программировал исключительно на ассемблере... :)


 

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.


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
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 ) );

:tooth:


 

Member
Статус: Не в сети
Регистрация: 11.07.2004
Откуда: Воронеж
Ребят кто нить PIC'и программировал для обмена по I2C?

_________________
Удачи и мудрости.


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Koval Я программировал, и? :)


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Билли Бонс писал(а):
for( i = 1; i <= ktup; ++i )
pot[i] = (int) pow( (double) 4, (double) ( i-1 ) );

:D Да уж) стесняюсь спросить - это программист писал, или как? Блин, даже я, далекий от программирования человек, и то бы так не сделал:)


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Самое забавное, я так понял, что это часто используемая программа для каких-то биологических расчётов. :) Вот здесь исходники, я разбирал версию 0.13-2...


 

Member
Статус: Не в сети
Регистрация: 11.07.2004
Откуда: Воронеж
Билли Бонс
Воооот... Это же здорово :) Исходники остались? а то мне надо в атмеловскую флешку передать строку по этому интерфейсу....

_________________
Удачи и мудрости.


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Koval Давай почту... Только исходники на ассемблере.


 

Member
Статус: Не в сети
Регистрация: 11.07.2004
Откуда: Воронеж
Билли Бонс отписал в ЛС, в целях защиты от спамеров :) За ранее спасибо :)

_________________
Удачи и мудрости.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman писал(а):
Думал как ссылку можно
Унарные операторы, интерпритируются справо на лево, т.е.
int *b;
int *&a = b; //Ссылка на указатель
int *a[10]; //Массив указателей
int (*a)[10]; //А это указатель на массив

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Ну я уже исходники нашел. Спасибо! А почему интересно указатель на указатель не заработал?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman покажи кусо кода, где вызываешь функцию, должно работать.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Чуть выше кусок кода, про указатель на указатель, от 02.03.2007 18:48.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman я про вызов говорю, такое впечатление, что ты что-то не то передаешь и пишешь в несуществующую память.

_________________
Ку ку


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 33 из 87<  1 ... 30  31  32  33  34  35  36 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan