Ascii2Float |
ha valakinek van egy assemblyben írt asc2float, esetleg egy float2asc,
akkor lécci dobjon már meg vele.
Panther
Ez a rutinom már lement a listán:
B EQU BYTE PTR W EQU WORD PTR D EQU DWORD PTR Q EQU QWORD PTR F EQU FWORD PTR O EQU OFFSET S EQU SMALL L EQU LARGE ValFloat MACRO _Float,_Src,_Save IFNB <_Save> ;; ASCII szám konvertálása PUSH _Save ;; lebegőpontos számmá ENDIF IFDIFI <_Src>, |
De valóban igaza van a következő levélnek, hogy a konverziót az FPU-ra kell bízni.
Ehhez nem kell a lebegobontos formatum !
Megkeresed, hogy hany jegy van a tizedes pont elott, a
10-nek annyiadik hatvanyat veszed. (exp vagy szorozgatas)
X = exp10(tizedespont elotti szamjegyek szama-1)
Es akkor annyi a helyierteke a legbaloldali szamjegynek. Van Y, ami kezdetben 0.
Veszed az elso szamjegyet, megszorzod X-el, es Y-hez adod. Aztan X-et elosztod 10-el (kovetkezo helyiertek) es a kovetkezo szam X szereset is Y-hoz adod. Es igy mesz. A tizedes pontot csak at kell lepned. Es ezeket a muveleteket FPU-val vegzed. Tehat nem kell float formatum. Es akkor Y-ben lesz az eredmeny.
Az csak akkor kell, ha mas procin akarsz 3ds-t beolvasni:)
remelem ertheto volt az algoritmus. Ha nem, akkor szolj vissza.
A forditotja is kurvara egyszeru. megnezed, hogy hany jegy lesz a tizedespont elott.
Y a szam kezdetben. log10(Y) es ezt felfele kell kerekiteni. (ez lehet - is) aztan akkor X=exp10(szamjegyek szama a tizedespont elott-1) szoval el ne felejts kerekiteni !
Es akkor Y-t elosztod X-el, az eredmeny az elso szamjegy. Y=a maradek. (Azaz csokkentetted) X-et elosztod 10-el. Es ujra megcsinalod ezt. Mar az elejen kiszamoltuk, hany jegy van a 10edes pont elott, annyi jegy utan jon a tizedespont berakasa a string-be. Es utana folytatod a muveletet egy darabig. Mondjuk 20 tizedes jegyig.
Es arra kell figyelni, amikor a szam kisebb mint 1. Azaz akkor a sok 0-t ki kell irni a pont utan. Szoval van benne osszetettseg. De a forditotja egyszerubb. Osszetettseg alatt a BUG lehetosegeket ertem.
Erdemes hasznalni egyet a LIBC-bol es akkor joval egyszerubb.
és itt egy általam írt megvalósítás:
GetDouble2: SUB AX,AX FLD1 @@1: LODSB CMP AL,' ' JE @@1 CMP AL,9 JE @@1 CMP AL,'+' JE @@1 CMP AL,'-' JNE @@2 FCHS JMP @@1 @@2: FLD1 FLDZ @@3: CMP AL,'.' JNE @@4 INC AH LODSB @@4: SUB AL,'0' JC @@5 CMP AL,9 JA @@5 MOV BYTE PTR DIGIT,AL FMUL CONST10 FIADD DIGIT LODSB TEST AH,AH JZ @@3 FXCH FMUL CONST10 FXCH JMP @@4 @@5: FDIVRP ST(1),ST FMULP ST(1),ST RETN CONST10 DD 10.0 DIGIT DD 0 |