Отлаживаю два процесса - два окна OllyDbg. У одного процесса - ST=1.4426950408889634070 ST(1)=2.4450000000000000000 у другого - ST=1.4426950408889634070 ST(1)=2.4450000000000000000 (т.е. это один и тот же процесс в двух сессиях Olly) Команда FMULP ST(1),ST Результат в первой сессии: ST=3.5273893749735155310 Результат во второй: ST=3.5273893749735156790 Ваши комментарии?
Мои коментарии таковы : на скока я понимаю сопроцессор для умножения (деления) использует стандартные процедуры такие как например умножение в дополнительном коде и со сдигом множимого влево ( и тп) .. а ведь все эти операции выполняются в двоичнах кодах и при сложении и сдвиге происходят (нередко) неточности (округления). из за большого количества разрядов, какой-то разряд при сдвиге теряеться из за того, что его нельзя вместить в разрядную сетку .. и эта единица отбрасывается ... вроде так
хм, получается интеловские процы не подходят для сверхточных вычислений? (интересно, на какие мирские процессы может оказать влияние неточность в 15 знаке)
Ну если будут расчитывать что-нибудь вроде гигантского ускорителя... Второе рождение вселенной или он просто сломается.
> хм, получается интеловские процы не подходят для сверхточных вычислений? Может тогда AMD'шные подходят
А в cwr значения округления устанавливаются перед этим? Или не контролируется? Видимо, другой процесс изменяет значение округления - отсюда и разница.
Похоже, что так и есть (значение FCW было бы хорошо привести здесь) но как чужой поток может изменить значение FPU Control Word? При создании потока (у меня) обычно там 0x027F находится (хотя это значение никто не гарантирует)
вы имеете ввиду то что olly обзывает EFL ? Нет, он и там и там равен 246, а после FMULP не меняется. Интересно другое - где бы FMULP не исполнился первым - результат в каждому из двух потоков не меняется, т.е. никакого влияния один на другой не оказывает... мистика какая-то.
Нет, это не EFL - в окне регистров, под st(0)-st(7) расположены регистры FST (FPU status word) и FCW (FPU control word) - по содержимому FCW изменяется тип округления (12 и 13 биты FCW). Значения FCW могут отличаться (если не контролируются явно перед выполнением)
Дело не столько в округлении (RC), сколько в ограниченной точности (PC). FCW = 02xxh соответствует RC = 00b = Near и PC = 10b = double precision = 53 бита = 15-16 десятичных знаков. Вот результаты и различаются в 17-м знаке (хотя тоже вопрос - почему). Если изменить PC = 11b = 3h = extended = 64 бит = 19-20 десятичных знаков, то получим более точный и стабильный результат = 3.5273893749735155300 (Для проверки, можно прямо в Оле перед FMULP изменить FCW -> Prec на 64-bit accuracy)
S_T_A_S_ > "При создании потока (у меня) обычно там 0x027F находится (хотя это значение никто не гарантирует)" При старте проги (у меня) обычно тоже FCW = 027Fh. Но, если принудительно инициализировать FPU, используя FINIT, то устанавливается FCW = 037Fh, т.е. extended 64-bit precision. Так-что, может быть FINIT'а и не хватает. Или где-то в проге сидит custom FLDCW.
чтоб хоть как-то соответствовать названию топика - пробовал ли кто-то нажимать на линк для закачки чего-нить при установленном Download Master-е и отлаживаемом в этот момент любом процессе в OllyDbg? Кстати, DM - не единственная прога, которая сильно не дружит с olly в моменты отладки. Сейчас не упомню, но были точно.