Странная штука.. a_ dq 1.448888739433602496d fld qword ptr [a_] смотрю в SoftIce - в st(0) ложится 1.448888739433602524 или компилятор переделывает 1.448888739433602496 в 1.448888739433602524 ???
Вопрос с бородой В формате dq = double всего 53 бита мантиссы (включая старший бит по умолчанию), что соответсвует 15-16 десятичным знакам, а ты аж 19 замутил Вот у тебя до 16-го знака и совпадает, а дальше - извини, битов не хватило
Ну... тогда я вообще запутался... Мне надо вычислить это- res = с3*a - c2*b + c1*c - c0*d; после последнего действия ("- c0*d") результат в программе на си- один, у меня - другой. делаю так: Код (Text): DWORD PTR и QWORD PTR - тут ошибок нет. fld DWORD PTR [a] fmul QWORD PTR [c3] ;c3*a fld DWORD PTR [b] fmul QWORD PTR [c2] fsubp st(1),st(0) ;с3*a - c2*b fld DWORD PTR [c] fmul QWORD PTR [c1] faddp st(1),st(0) ;с3*a - c2*b + c1*c ;для проверки ниже отдельно сохраняем (с3*a - c2*b + c1*c) fst qword ptr [tmp1_] fld DWORD PTR [d] fmul QWORD PTR [C0] ;c0*d ;для проверки ниже отдельно сохраняем (c0*d) fst qword ptr [tmp2_] ;вот тут результат- отличный от результата на си fsubp st(1),st(0) ;с3*a - c2*b + c1*c - c0*d ;!!! ЭТО НЕ СОВПАДАЕТ С РЕЗУЛЬТАТОМ В СИ !!! fst qword ptr [tmp3_] ;тут res= 3C AC 00 00 00 00 00 00 ;---- теперь проверяем: ;сохраненное в qword (с3*a - c2*b + c1*c) - сохраненное в qword (c0*d) fld qword ptr [tmp1_] ;берем сохраненное в qword (с3*a - c2*b + c1*c) fsub qword ptr [tmp2_] ;(с3*a - c2*b + c1*c)- сохраненное в qword (c0*d) ;!!! ЭТО СОВПАДАЕТ С РЕЗУЛЬТАТОМ В СИ !!! fstp qword ptr [tmp3_] ;тут res= 3C B0 00 00 00 00 00 00 ; т.е., говоря короче, если операнды последнего действия ("- c0*d") берутся из стэка, то результат- 3C AC 00 00 00 00 00 00 (это- уже перевернутое значение, в памяти лежит все наоборот) (ОТЛИЧНЫЙ от результата на си), а если оба эти операнда сначала записать в qword, а потом взять оттуда и произвести вычитание- то результат- 3C B0 00 00 00 00 00 00 (это- уже перевернутое значение, в памяти лежит все наоборот) -такой же, как в программе на си (и это - ПРАВИЛЬНЫЙ результат.) Может это из-за того, что в стеке все считается в 80 битном виде, а когда я записываю в qword, значения из стека записываются откругленными? Если так, то тогда вопрос- как вычесть, не используя запись во временные переменные, а вычитая значения в стеке, чтобы результат был таким же, как и в си? и самое интересное- скомпилировал программу на си с генерацией асм листинга, так там- тот же самый код, что и у меня (без использования tmp_ переменных, все вычисления- со стеком). И все , все- то же самое.. Все константы объявлены так же, все то же самое. И это- самое жуткое. У меня голова уже дымится... Может, опции компилятора?... почему???
Открыл Америку Ты об FPU Control Word и битах PC (precision control) слышал ? Так вот у тебя по умолчанию установлена максимальная точность extended PC = 11b, а в сях используется точность double PC = 10b и при каждом fmul результат округляется до double. Для ликбеза почитай IA-32, v.1, а также см. инструкции FSTCW и FLDCW
Quantum, Есть работающий алгоритм на си, обрабатывающий данные, мне нужно переписать его на асм. Поэтому и надо, чтобы было как в си. Благодаря помощи уже сделал.