fild DWORD ptr [edi]
fiadd DWOPD ptr [ebp+8]
fmul st(0), st(0)
Вычислить на Fpu
x xo + ^2 a ^2 / y oy + ^2 b ^2 / +
---------------------------------------------
Проблема в том, что все операнды выражения
целочисленные значения, а результаты некоторых
операции числа с плавающей точкой:
Т. е.
вот допустим начало выражения я запрограммирую так:
fild DWORD ptr [edi] ;это x
fiadd DWOPD ptr [ebp+8] ;это xo
Теперь у меня на вершине стека сопроцессора
число x+xo, которое мне надо возвести в квадрат
Если бы оно было вещественным, то я бы возвёл его
в квадрат так: fmul st(0)
и получил бы (x+xo)^2, но поскольку в st(0)
целое число, то fmul не катит, а для использования
fimul мне придётся сначало выгружать x+ox в память, что, во-первых, медленно. Во-вторых,
место в стеке для x+xo заранее выделять надо,
т.е. чё то типа такого:
fist [ebp-4]
fimul DWORD ptr [ebp-4]
Какие есть быстрые способы преобразования числа из одного формата в другой не выгружая операнда в память и не загружая его обратно.
Если кто предложит вариан вычисления этого
выражения с вычислением целочисленных операций чисто на CPU тоже буду благодарен.
Цитата:
Originally posted by bave
Какие есть быстрые способы преобразования числа из одного формата в другой не выгружая операнда в память и не загружая его обратно.
Какие есть быстрые способы преобразования числа из одного формата в другой не выгружая операнда в память и не загружая его обратно.
Не надо ничего преобразовывать. В FPU все числа с точкой. Т.е. код:
Код:
будет нормально работать.
При загрузки любых операндов в стек сопроцессор сам преобразовывает их во временное вещественное (10 байт) представление
Спасибо. Пудово так работает, даже считает как надо :)