FLOAT
Aritmetika s plovoucí čárkou
Knihovní funkce aritmetiky s plovoucí čárkou simulují matematický koprocesor pro výpočty s jednoduchou přesností. Pro velký rozsah kódu jsou zde pouze nejzákladnější matematické operace. Chybí goniometrické funkce, mocniny, logaritmy. Důvodem chybějících funkcí je i to, že interní výpočty s jednoduchou přesností by způsobovaly příliš velkou chybovost výsledku. Je-li k dispozici matematický koprocesor, použije se pro složitější výpočty jeho podpora. Může tím vzniknout malá odchylka na posledních desetinných místech oproti emulovanému výpočtu.
Čísla s plovoucí čárkou v jednoduché přesnosti odpovídají formátu IEEE 754-1985. Velikost operandu je 4 bajty, z toho:
- bit 31: znaménkový bit, 1=negativní
číslo, 0=pozitivní číslo
- bit 23..30: exponent (8 bitů) posunutý o 127 (tj. nulový
exponent, např. pro číslo "1", má posunutou hodnotu
127)
- bit 0..22: mantisa (23 bitů) bez nejvýznamnějšího bitu
"1"
Exponent je v rozsahu -126 .. +127 (v posunuté hodnotě 1 .. 254). Exponent -127 (posunutá hodnota 0) představuje nulu. Na rozdíl od fyzického koprocesoru se zde nepočítá se subnormálními hodnotami (tj. s exponentem -127 a nenulovou mantisou). Exponent +128 (posunutá hodnota 255) představuje nekonečno NaN (přetečení výsledku). Záporné nekonečno se nepoužívá.
Čísla jsou v rozsahu 1.1754944e-38 (=00800000h) až 1.7014118e+38 (=7F000000h), kladná nebo záporná.
FloatZero - floating-point zero constant
OUTPUT:
DX:AX = 0.0
FloatOne - floating-point one constant
OUTPUT:
DX:AX = 1.0
FloatInf - floating-point infinity constant
OUTPUT:
DX:AX = 1.#INF000
FloatPi - floating-point PI constant
OUTPUT:
DX:AX = PI constant (3.14159265)
FloatNeg - floating-point negate number
INPUT:
DX:AX = number
OUTPUT:
DX:AX = result
NOTES: Only highest byte of number (DH) is needed.
FloatAbs - floating-point absolute number
INPUT:
DX:AX = number
OUTPUT:
DX:AX = result
NOTES: Only highest byte of number (DH) is needed.
FloatCmp - floating-point comparison
INPUT:
DX:AX = first operand
CX:BX = second operand
OUTPUT:
AL = 1 if first > second, 0 if first = second, -1 if first
< second
SF, ZF = as for "signed CMP first,second", use JL, JG,
JLE,...
FloatCmpZ - floating-point comparison with zero
INPUT:
DX:AX = operand
OUTPUT:
AL = 1 if operand > 0, 0 if operand = 0, -1 if operand < 0
SF, ZF = as for "signed CMP operand,0", use JL, JG,
JLE,...
FloatFact - floating-point factorial
INPUT:
AL = integer number 0..34
OUTPUT:
DX:AX = floating-point number n!
FloatInvFact - floating-point invert factorial
INPUT:
AL = integer number 0..34
OUTPUT:
DX:AX = floating-point number 1/n!
FloatFromWord - import floating-point from unsigned word
INPUT:
AX = integer unsigned number
OUTPUT:
DX:AX = floating-point number
FloatFromDWord - import floating-point from unsigned dword
INPUT:
DX:AX = integer unsigned number
OUTPUT:
DX:AX = floating-point number
FloatFromSWord - import floating-point from signed word
INPUT:
AX = integer signed number
OUTPUT:
DX:AX = floating-point number
FloatFromSDWord - import floating-point from signed dword
INPUT:
DX:AX = integer signed number
OUTPUT:
DX:AX = floating-point number
FloatToWord - export floating-point to unsigned word
INPUT:
DX:AX = floating-point number
OUTPUT:
AX = integer unsigned number
FloatToDWord - export floating-point to unsigned dword
INPUT:
DX:AX = floating-point number
OUTPUT:
DX:AX = integer unsigned number
FloatToSWord - export floating-point to signed word
INPUT:
DX:AX = floating-point number
OUTPUT:
AX = integer signed number
FloatToSDWord - export floating-point to signed dword
INPUT:
DX:AX = floating-point number
OUTPUT:
DX:AX = integer signed number
FloatAdd - floating-point addition
INPUT:
DX:AX = first operand
CX:BX = second operand
OUTPUT:
DX:AX = result
FloatSub - floating-point subtraction
INPUT:
DX:AX = first operand
CX:BX = second operand
OUTPUT:
DX:AX = result (= first - second)
FloatMul - floating-point multiplication
INPUT:
DX:AX = first operand
CX:BX = second operand
OUTPUT:
DX:AX = result
FloatDiv - floating-point division
INPUT:
DX:AX = first operand (dividend)
CX:BX = second operand (divisor)
OUTPUT:
DX:AX = result (quotient)
FloatInv - floating-point inverse (reciprocal) value
INPUT:
DX:AX = operand
OUTPUT:
DX:AX = result (1/operand)
Constants:
FLOAT_INF: (=7F800000h) floating-point
infinity value
FLOAT_ZERO: (=0) floating-point zero value
FLOAT_ONE: (=3F800000h) floating-point one value
FACT_MAX: (=34) max. valid factorial index