MASM32 и OpenGL
Это не так сложно, как на самом деле

Числа с плавающей запятой

Встроенный сопроцессор FPU позволяет производить любые вычисления, но вывести результаты вычислений не так просто. Для этого требуется или использование библиотеки fpu.lib, входящей в состав стандартной поставки masm32 или использование специальных функций, например, типа описанной в руководстве по FPU (тоже прилагается, дает два десятичных знака). Но можно использовать еще более короткую функцию, построенную на основании такого алгоритма: берем число с плавающей запятой, отбрасываем дробную часть, оставшееся целое преобразуем в строку. К строке добавляем символ-разделитель (например, точку), оставшуюся дробную часть умножаем на единицу со столькими нулями, сколько необходимо знаков после запятой и повторяем операцию. К строке с целой частью и символом-разделителем добавляем строку с десятичными знаками. Осталось куда-нибудь вывести результат. Код функции:

; #########################################################################
; FloattoA1 PROTO :DWORD,:DWORD
; #########################################################################
FloattoA1 PROC source:DWORD,destination:DWORD
LOCAL Flags :WORD,tmpval:DWORD
LOCAL buff[12]:byte

.data
dec_mult dd 10000
fMtStrinG db "%lu",0

.code
fstcw Flags
or Flags,0000110000000000b
fldcw Flags
fld[source]
frndint
fist[tmpval]

invoke wsprintf,destination,ADDR fMtStrinG,tmpval
invoke lstrcat,destination,ADDR point

finit
fld[source]
fisub[tmpval]
fimul[dec_mult]
fabs
frndint
fist[tmpval]

invoke wsprintf,ADDR buff,ADDR fMtStrinG,tmpval
invoke lstrcat,destination,ADDR buff
ret
FloattoA1 ENDP
; #########################################################################

Установка флагов процессора необходима для правильного режима округления, а именно - отброса дробной части. Если этого не сделать, будет произведено обычное округление, которое устанавливается при инициализации процессора. После этого вернутся к обычному округлению можно командой finit и продолжить работу с дробной частью числа. Константа dec_mult задает число десятичных знаков, в приведенном примере их четыре. Подобную функцию удобно применять для контроля промежуточных результатов вычислений. Функция вызывается командой

Переменная типа float, передаваемая функции, должна быть объявлена как глобальная.

©   Короленко М.В., 2011       
Перепечатка материалов возможна только после согласования с автором при условии обязательной ссылки на сайт