News:

Masm32 SDK description, downloads and other helpful links
Message to All Guests
NB: Posting URL's See here: Posted URL Change

Main Menu

Converting a Real10 to string

Started by RuiLoureiro, April 28, 2013, 05:26:33 AM

Previous topic - Next topic

Gunther

Hi Mikl__,

Dave gave the right answer. You could also copy commands direct onto the command line (the path, for example). That works fine under Windows 7.

Gunther
You have to know the facts before you can distort them.

Mikl__

Hi Gunther!Thank you!! I have Win XP

RuiLoureiro

Olá Mikl,
            SAVE_COUNTER_CYCLE etc. you may find in the
            topic "Converting real8 to string", inside the
            folder Converter8.zip, in the file "Timing.inc".
            In asm file we should define

.data
                     dd  N               ;<--- number of strings = number of procs in test
_TblString0   dd offset string1    ; <=> proc 1
                     dd offset string2    ; <=> proc 2
                     ...
                     dd offset stringN

At the end call SortCycles to show the table

You dont need to include macros in .code.

Simple include file after
.686
.mmx
.xmm
;-------------------------------------------
; or write macros here, for instance
...
...
.data
...
.code
--------------------------------------------
I will test your new procedure

Mikl__

#48
It's possible even speed up the transformation of Real10 -> string comparisons if, instead of the test queue if the number is normalized, denormalized, zero, infinity, SNaN, QNaN, unsupported format, and so on if manage the transition from the table of addresses and comparing themselves can be done without the use of conditional branches. Although this is a "raw" code, but I think the message is clear       mov ecx,lpReal11
mov ebx,[ecx]
mov esi,[ecx+4]
mov edx,[ecx+6]
xor eax,eax
shl edx,1
adc eax,0; 1-st bit is sign
add edx,20000h
adc eax,eax; 2-nd bit is exp=7FFF
        sub edx,20000h; restore edx
xor edx,0FFFE0000h
add edx,20000h;if the contents of 31-17 bits of register EDX equal to zero, the carry flag is set
adc eax,eax; 3-rd bit is exp=0
shld eax,esi,2; 4-th bit is integer part and 5-th bit is f[62]
shl esi,2
not esi
not ebx
add esi,1; if the contents of register ESI equal to zero, the carry flag is set
adc eax,eax; 6-th bit is f[61:32]=0
add ebx,1;  if the contents of register EBX equal to zero, the carry flag is set
adc eax,eax; 7-th bit is f[31:0]=0
        jmp table2[eax*4]
;+inf eax=2Bh
;-inf eax=6Bh
;+0.0 eax=13h
;-0.0 eax=53h
;+1.0 eax=0Bh
;+2.0 eax=0Bh
;max normal        eax=0C|7ffe ffffffff ffffffff|1.18973149535723176505e+4932
;min normal        eax=0B|0001 80000000 00000000|3.36210314311209350626e-4932
;max subnormal     eax=14|0000 7fffffff ffffffff|3.36210314311209350608e-4932
;min subnormal     eax=12|0000 00000000 00000001|3.64519953188247460253e-4951
;quiet NaN with          |                      |
;greatest fraction eax=2C|7fff ffffffff ffffffff| QNaN
;quiet NaN with          |                      |
;least fraction eax=2F|7fff c0000000 00000000| QNaN
;signaling NaN with      |                      |
;greatest fraction eax=28|7fff bfffffff ffffffff| SNaN
;signaling NaN with      |                      |
;least fraction eax=2A|7fff 80000000 00000001| SNaN
;Unsupported eax=03|4000 00000000 00000000| Error

Mikl__

"raw" code; masm windows console #
include \masm32\include\masm32rt.inc
.686
.mmx
.xmm
;---------------------------------------------------------------
;constats
$max equ 90; <-- This number may be increased
magic1 equ 4D104D42h;lg(2)*4294967296=1292913986,4918210386020002827249...
magic2  equ 35269h;log2(10)*65536=3,32192809488736234780*65536=217705,8796265381788254208..
;---------------------------------------------------------------
;macro
START_COUNTER_CYCLE_HIGH_PRIORITY_CLASS   MACRO         ;LoopCount, Priority
                      LOCAL   label

            IFNDEF __counter__stuff__defined__
                __counter__stuff__defined__ equ <1>
            .data
            ALIGN 8             ;; Optimal alignment for QWORD
            ; __counter__qword__count__  dq 0
            ; __counter__loop__count__   dd 0
            ; __counter__loop__counter__ dd 0

                _CounterQword   dq 0            ; __counter__qword__count__
                _LoopCount      dd 0            ; __counter__loop__count__
                _LoopCounter    dd 0            ; __counter__loop__counter__
                               
            .code
            ENDIF

            mov     _LoopCount, 1000000     ;LoopCount
           
            invoke  GetCurrentProcess
            invoke  SetPriorityClass, eax, HIGH_PRIORITY_CLASS  ;Priority

            xor     eax, eax        ;; Use same CPUID input value for each call
            cpuid                   ;; Flush pipe & wait for pending ops to finish
            rdtsc                   ;; Read Time Stamp Counter

            push    edx             ;; Preserve high-order 32 bits of start count
            push    eax             ;; Preserve low-order 32 bits of start count
           
            mov     _LoopCounter, 1000000   ;LoopCount
            xor     eax, eax
            cpuid                   ;; Make sure loop setup instructions finish
          ALIGN 16                  ;; Optimal loop alignment for P6
          @@:                       ;; Start an empty reference loop
            sub     _LoopCounter, 1
            jnz     short @B

            xor     eax, eax
            cpuid                   ;; Make sure loop instructions finish
            rdtsc                   ;; Read end count
            pop     ecx             ;; Recover low-order 32 bits of start count
            sub     eax, ecx        ;; Low-order 32 bits of overhead count in EAX
            pop     ecx             ;; Recover high-order 32 bits of start count
            sbb     edx, ecx        ;; High-order 32 bits of overhead count in EDX
            push    edx             ;; Preserve high-order 32 bits of overhead count
            push    eax             ;; Preserve low-order 32 bits of overhead count

            xor     eax, eax
            cpuid
            rdtsc
            push    edx             ;; Preserve high-order 32 bits of start count
            push    eax             ;; Preserve low-order 32 bits of start count
            mov     _LoopCounter, 1000000   ;LoopCount
            xor     eax, eax
            cpuid                   ;; Make sure loop setup instructions finish
ALIGN 16                            ;; Optimal loop alignment for P6
label:                              ;; Start test loop
            START_LOOP_TEST equ <label>
ENDM
; ----------------------------------------------------------------------------------------------
SAVE_COUNTER_CYCLE  MACRO  arg
                    LOCAL  $tmpstr$

        sub     _LoopCounter, 1
        jnz     START_LOOP_TEST

        xor   eax, eax
        cpuid                 ;; Make sure loop instructions finish
        rdtsc                 ;; Read end count
        pop   ecx             ;; Recover low-order 32 bits of start count
        sub   eax, ecx        ;; Low-order 32 bits of test count in EAX
        pop   ecx             ;; Recover high-order 32 bits of start count
        sbb   edx, ecx        ;; High-order 32 bits of test count in EDX
        pop   ecx             ;; Recover low-order 32 bits of overhead count
        sub   eax, ecx        ;; Low-order 32 bits of adjusted count in EAX
        pop   ecx             ;; Recover high-order 32 bits of overhead count
        sbb   edx, ecx        ;; High-order 32 bits of adjusted count in EDX

        mov   DWORD PTR _CounterQword, eax
        mov   DWORD PTR _CounterQword + 4, edx

        invoke GetCurrentProcess
        invoke SetPriorityClass, eax, NORMAL_PRIORITY_CLASS

        finit
        fild  _CounterQword
        fild  _LoopCount
        fdiv
        fistp _CounterQword

        mov     eax, DWORD PTR _CounterQword
        ; ----------------------
        ;      Save time
        ; ----------------------
        call    SaveTiming
       
        print   str$(eax)
;---------------------------------------------------       
        $tmpstr$  CATSTR <chr$(">, <arg>, <",13,10)>       
        print   $tmpstr$, 13,10
ENDM
.data
ALIGN 16
    cntr = -$max
    REPEAT 2*$max+1
        IF cntr NE 0
            REAL10 @CatStr(<1.0e>,%-cntr)
        ELSE
            tabs REAL10 1.0
        ENDIF
dw 0,0,0
        cntr = cntr + 1
    ENDM
ALIGN 16
_Real10_R dt 123.45678e-2
max_ten REAL10 1.0e+4931
align 16
    table0  label word
n=0
rept 100
dd (n mod 10 shl 8)+(n/10)+"00"
n=n+1
endm   
ALIGN 16
table1 dd shift0,shift1,shift2,shift3,shift4
table2 dd 8 dup(Error),PNormal,PNormal,Error,PNormal,PNormal,6 dup (Error),\
;          0-7,         8,      9,      0Ah,  0Bh,    0Ch,     0Dh-12h,
PZero,(2Ah-14h+1)dup (Error),PInfinity,(47h-2Ch+1)dup (Error),NNormal,(52h-49h+1)dup (Error),\
;13h,  14h-2Ah,              2Bh,       2Ch-47h,              48h,49h-52h
NZero,(6Ah-54h+1)dup (Error),NInfinity,(7Fh-6Ch+1)dup (Error)
;53h,  54h-6Ah,              6Bh,       6Ch-7Fh
;2B +inf
;6B -inf
;+0.0 eax=13h
;-0.0 eax=53h
;+1.0 eax=0Bh
;+2.0 eax=0Bh
dd 1
_TblTiming0 dd 60 dup (?)
.code
main proc
LOCAL result[32]:BYTE

    START_COUNTER_CYCLE_HIGH_PRIORITY_CLASS
lea eax,result
push eax
push offset _Real10_R
call Eprst
    SAVE_COUNTER_CYCLE < cycles, Eprst, _Real10_2 >
; print ADDR result,13,10
inkey " *** STOP - Eprst --- E N D ---*** "
exit
   
main endp
;=================================================
SaveTiming  proc
           
            mov     edx, offset _TblTiming0
            mov     ecx, [edx-4]
            mov     [edx+ecx*4], eax
            add     ecx, 1
            mov     [edx-4], ecx                   
            ret

SaveTiming  endp
;================================================
Eprst proc

lpReal11 equ dword ptr [esp+16+buffer]
lpDest equ lpReal11+4
iExp equ dword ptr [esp-4]
aExp equ iExp-4
x equ aExp-4*3
temp1 equ x-4
temp2 equ temp1-4
buffer = 1Ch

push edi
push esi
push ebx
sub esp,buffer
fninit
        mov ecx,lpReal11
fld tbyte ptr [ecx]
mov edi,lpDest
mov ebx,[ecx]
mov esi,[ecx+4]
mov [x],ebx
movzx eax,word ptr [ecx+8]
mov aExp,0
mov [x+4],esi
mov [x+8],eax
mov edx,[ecx+6]
xor eax,eax
shl edx,1
adc eax,0; 1-st bit is sign
add edx,20000h
adc eax,eax; 2-nd bit is exp=7FFF
        sub edx,20000h
xor edx,0FFFE0000h
add edx,20000h
adc eax,eax; 3-th bit is exp=0
shld eax,esi,2; 4-th bit is j 5-th bit is f[62]
shl esi,2
not esi
not ebx
add esi,1
adc eax,eax; 6-th bit is f[61:32]=0
add ebx,1
adc eax,eax; 7-th bit is f[31:0]=0
jmp table2[eax*4]
;max normal        eax=0C|7ffe ffffffff ffffffff|1.18973149535723176505e+4932
;min normal        eax=0B|0001 80000000 00000000|3.36210314311209350626e-4932
;max subnormal     eax=14|0000 7fffffff ffffffff|3.36210314311209350608e-4932
;min subnormal     eax=12|0000 00000000 00000001|3.64519953188247460253e-4951
;quiet NaN with          |                      |
;greatest fraction eax=2C|7fff ffffffff ffffffff| QNaN
;quiet NaN with          |                      |
;least fraction    eax=2F|7fff c0000000 00000000| QNaN
;signaling NaN with      |                      |
;greatest fraction eax=28|7fff bfffffff ffffffff| SNaN
;signaling NaN with      |                      |
;least fraction    eax=2A|7fff 80000000 00000001| SNaN
;Unsupported       eax=03|4000 00000000 00000000|
;Uncertainty       eax=  | |
movzx edx,word ptr [ecx+8]
mov [x+8],edx
cmp edx,8000h ;positive or negative number?
mov byte ptr [edi],'-'
sbb esi,esi   ;if positive esi=0FFFFFFFFh if negative esi=0
and esi,0Dh   ;if positive esi=0Dh if negative esi=0
sub [edi],esi ;if positive [edi]=" " if negative [edi]="-"
and edx,7FFFh ;fabs
jnz a2        ;normal or Infinity or SNAN or QNAN or Uncertainty

Denormal_or_Normal: test eax,80000000h
jnz PNormal
Denormal:fld max_ten  ;st(0)=1.0e+4931
mov aExp,-4931*2
fmul                  ;normalization
fld st
fstp tbyte ptr x
mov ebx,[x]
mov eax,[x+4]
mov edx,[x+8]
jmp PNormal
a2: cmp edx,7FFFh
jz Infinity_Or_SNAN_Or_QNAN_Or_Uncertainty
NNormal::mov byte ptr [edi],'-'
jmp @f
ALIGN 16
PNormal::mov byte ptr [edi],' '
@@: mov edx,[x+8]
mov eax,magic1
and edx,7FFFh ;fabs
mov esi,10
sub edx,16383
mov word ptr [edi+21],'+E'
imul edx
add edx,edx
mov iExp,edx
jz @f
cmp edx,2*$max
jg a1
cmp edx,-2*$max
jge load
;------------------------------------------------
sub edx,1
a1: neg edx;
sar edx,1
mov temp1,edx
imul edx,magic2
sar edx,16
mov temp2,edx
fild temp2         ; get the characteristic
fild temp1         ; log2(10)*expscale
fldl2t    ; log2(10)
        fmul               ; log2(10)*expscale
        fsub st,st(1)      ; get only the mantissa but keep the characteristic
        f2xm1              ; 2^(mantissa)-1
        fld1
        fadd               ; add 1 and pop
        fscale
        fstp    st(1)      ; remove the characteristic
        jmp multiply
ALIGN 16
load: fld tabs[edx*8];[edx+edx*4]
multiply:fmul              ; X * 10^expscaleS
fld st
fstp tbyte ptr x
xor edx,edx
@@: mov ecx,[x+8]
mov ebx,[x]
        mov eax,[x+4]
and ecx,7FFFh
sub ecx,16382
cmp ecx,4
ja shift0
jmp table1[ecx*4]
ALIGN 16
shift4::test eax,60000000h
jz a6
fld tabs[16]
fmul
add iExp,2
fstp tbyte ptr x
mov eax,[x+4]
        mov ebx,[x]
shld edx,eax,1
shld eax,ebx,1
shl ebx,1
add ebx,4
jmp shift0
a6: shld edx,eax,4 ;ecx=1 ebx+4
shld eax,ebx,4 ;ecx=2 ebx+8
shl ebx,4      ;ecx=3 ebx+9
add ebx,12     ;ecx=4 ebx+12
jmp shift0
ALIGN 16
shift3::shld edx,eax,3
shld eax,ebx,3
shl ebx,3
add ebx,9;10
jmp shift0
ALIGN 16
shift2::shld edx,eax,2
shld eax,ebx,2
shl ebx,2
add ebx,8
jmp shift0
ALIGN 16
shift1::shld edx,eax,1
shld eax,ebx,1
shl ebx,1
add ebx,4
ALIGN 16
shift0::adc eax,0
adc edx,0
mov [edi+1],dl
mov byte ptr [edi+2],',';point
or byte ptr [edi+1],'0'
   
k=3
    REPEAT 17
        mul esi
        mov [edi+k],dl
        mov ecx,eax
        mov eax,ebx
        mul esi
        add ecx,edx
        adc byte ptr [edi+k],'0'
        mov ebx,eax
        mov eax,ecx
k=k+1
    ENDM

mul esi
mov [edi+k],dl
mov ecx,eax
mov eax,ebx
mul esi
add ecx,edx
adc byte ptr [edi+k],'0'
;--------------------------------------
mov eax,iExp
add eax,aExp
mov edx,eax
sar eax,1
sar edx,31
mov ecx,esi
xor eax,edx
sub eax,edx
and edx,2
add byte ptr [edi+22],dl
mov esi,eax
mov edx,42949673;2^32/100
mul edx
mov eax,dword ptr table0[edx*4] ;edx = quotient of the division by 100
mov dword ptr [edi+23],eax
lea eax,[edx*4];100 dec = 1100100 bin
shl edx,2
lea edx,[edx+edx*2]
lea edx,[eax+edx*8] ;edx = quotient*100
sub esi,edx;esi = remainder of the division by 100
mov eax,dword ptr table0[esi*4]
mov dword ptr [edi+25],eax
mov ebx,[esp+buffer];pop ebx
mov dword ptr [edi+27],0
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
retn 8
Infinity_Or_SNAN_Or_QNAN_Or_Uncertainty:
cmp eax,80000000h
jnz SNAN_Or_QNAN_Or_Uncertainty
and ebx,ebx
jnz SNAN_Or_QNAN_Or_Uncertainty
SNAN_Or_QNAN_Or_Uncertainty:
test eax,eax
jns Error
test eax,40000000h
jnz QNAN
        mov dword ptr [edi+1],'ngiS'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+5],'N la'
        mov dword ptr [edi+9],'a no'
        mov dword ptr [edi+13],'muN '
        mov dword ptr [edi+17],'reb'
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
ret 8
QNAN: test eax,3FFFFFFFh
jnz @f
test ebx,ebx
jnz @f
        mov dword ptr [edi+1],'ecnU'
        mov dword ptr [edi+5],'iatr'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+9],'ytn'
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
ret 8
@@: mov dword ptr [edi+1],'eiuQ'
        mov dword ptr [edi+5],'oN t'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+9],' a n'
        mov dword ptr [edi+13],'bmuN'
        mov dword ptr [edi+17],'re'
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
ret 8
NInfinity::mov dword ptr [edi],'fnI-'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+4],'tini'
        mov dword ptr [edi+8],'y'
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
ret 8
PInfinity::mov dword ptr [edi],'fnI+'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+4],'tini'
        mov dword ptr [edi+8],'y'
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
ret 8
NZero:: mov dword ptr [edi],'0.0-'
mov ebx,[esp+buffer];pop ebx
mov dword ptr [edi+4],0
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
        retn 8
PZero:: mov dword ptr [edi],'0.0+'
mov ebx,[esp+buffer];pop ebx
mov dword ptr [edi+4],0
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
        retn 8
Error:: mov dword ptr [edi],'orrE'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+4],'r'
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
ret 8
Eprst endp
end main

RuiLoureiro

Hi Mikl,
         1. i understood the method you are using
            and it seems to be good  :t
         2. with this last procedure where you are
            using power tables of 16 bytes and
            a different magicnumber1 you need to
            test at least the following cases
            (and others). You should write a new
            file with all data and then include it
            include FileData.inc
(it's a hint)


;7FFF_80000000_00000000:  +8
_PlusInfinity   dd 00000000h, 80000000h, 7FFFh

;FFFF_80000000_00000000:  -8               
_MinusInfinity  dd 00000000h, 80000000h, 0FFFFh

;0000_00000000_00000001: 00000000 0000001D +3.64519953188247460253e-4951
_DemormalI1     dd 00000001h, 00000000h, 0 ;3.6451995318824746e-4951

;0000_FFFFFFFF_FFFFFFFF: 00000000 0000001D +6.72420628622418701216e-4932               
_DemormalE1     dd 0FFFFFFFFh, 7FFFFFFFh, 0
               
;------------------------------------------
;8000_0000_0000_0000 to FFFF_FFFF_FFFF_FFFF   Signed Pseudo-Denormal
;------------------------------------------

;0000_80000000_00000000: 00000000 0000001D +3.36210314311209350626e-4932
_DemormalI2     dd 00000000h, 80000000h, 0
               
;0000_FFFFFFFF_FFFFFFFF: 00000000 0000001D +6.72420628622418701216e-4932               
_DemormalE2     dd 0FFFFFFFFh, 0FFFFFFFFh, 0

;7FFE_FFFFFFFF_FFFFFFFF: 00000000 0000001D +1.18973149535723176502e+4932
_LimitReal10_1  dd 0FFFFFFFFh, 0FFFFFFFFh, 7FFEh

;FFFE_FFFFFFFF_FFFFFFFF: 00000000 0000001D +1.18973149535723176502e+4932               
_LimitReal10_2  dd 0FFFFFFFFh, 0FFFFFFFFh, 0FFFEh


dedndave

these are the real10 test values i used   :P
0000_0000_0000_0000_0000
0000_0000_0000_0000_0001
0000_7FFF_FFFF_FFFF_FFFF
0000_8000_0000_0000_0000
0000_8000_0000_0000_0001
0000_FFFF_FFFF_FFFF_FFFF
0001_0000_0000_0000_0000
0001_0000_0000_0000_0001
0001_7FFF_FFFF_FFFF_FFFF
0001_8000_0000_0000_0000
0001_8000_0000_0000_0001
0001_FFFF_FFFF_FFFF_FFFF
0002_0000_0000_0000_0000
0002_0000_0000_0000_0001
0002_7FFF_FFFF_FFFF_FFFF
0002_8000_0000_0000_0000
0002_8000_0000_0000_0001
0002_FFFF_FFFF_FFFF_FFFF
7FFE_0000_0000_0000_0000
7FFE_0000_0000_0000_0001
7FFE_7FFF_FFFF_FFFF_FFFF
7FFE_8000_0000_0000_0000
7FFE_8000_0000_0000_0001
7FFE_FFFF_FFFF_FFFF_FFFF
7FFF_0000_0000_0000_0000
7FFF_0000_0000_0000_0001
7FFF_7FFF_FFFF_FFFF_FFFF
7FFF_8000_0000_0000_0000
7FFF_8000_0000_0000_0001
7FFF_BFFF_FFFF_FFFF_FFFF
7FFF_C000_0000_0000_0000
7FFF_C000_0000_0000_0001
7FFF_FFFF_FFFF_FFFF_FFFF
8000_0000_0000_0000_0000
8000_0000_0000_0000_0001
8000_7FFF_FFFF_FFFF_FFFF
8000_8000_0000_0000_0000
8000_8000_0000_0000_0001
8000_FFFF_FFFF_FFFF_FFFF
8001_0000_0000_0000_0000
8001_0000_0000_0000_0001
8001_7FFF_FFFF_FFFF_FFFF
8001_8000_0000_0000_0000
8001_8000_0000_0000_0001
8001_FFFF_FFFF_FFFF_FFFF
8002_0000_0000_0000_0000
8002_0000_0000_0000_0001
8002_7FFF_FFFF_FFFF_FFFF
8002_8000_0000_0000_0000
8002_8000_0000_0000_0001
8002_FFFF_FFFF_FFFF_FFFF
FFFE_0000_0000_0000_0000
FFFE_0000_0000_0000_0001
FFFE_7FFF_FFFF_FFFF_FFFF
FFFE_8000_0000_0000_0000
FFFE_8000_0000_0000_0001
FFFE_FFFF_FFFF_FFFF_FFFF
FFFF_0000_0000_0000_0000
FFFF_0000_0000_0000_0001
FFFF_7FFF_FFFF_FFFF_FFFF
FFFF_8000_0000_0000_0000
FFFF_8000_0000_0000_0001
FFFF_BFFF_FFFF_FFFF_FFFF
FFFF_C000_0000_0000_0000
FFFF_C000_0000_0000_0001
FFFF_FFFF_FFFF_FFFF_FFFF

RuiLoureiro

#52
I used this data in the file TestData.inc

.data
_Real10D_00    dt 0.0

_Real10D_01    dt 0.1
_Real10D_02    dt 0.2
_Real10D_03    dt 0.3
_Real10D_04    dt 0.4
_Real10D_05    dt 0.5
_Real10D_06    dt 0.6
_Real10D_07    dt 0.7
_Real10D_08    dt 0.8
_Real10D_09    dt 0.9

_Real10D_11    dt 1.0
_Real10D_12    dt 2.0
_Real10D_13    dt 3.0
_Real10D_14    dt 4.0
_Real10D_15    dt 5.0
_Real10D_16    dt 6.0
_Real10D_17    dt 7.0
_Real10D_18    dt 8.0
_Real10D_19    dt 9.0

;---------------------------------
_Real10_a11    dt -1.23456789123456
_Real10_a12    dt -12.3456789123456
_Real10_a13    dt -123.456789123456
_Real10_a14    dt -1234.56789123456
_Real10_a15    dt -12345.6789123456
_Real10_a16    dt -123456.789123456
_Real10_a17    dt -1234567.89123456
_Real10_a18    dt -12345678.9123456
_Real10_a19    dt -12345678.9123456
_Real10_a20    dt -123456789.123456
_Real10_a21    dt -1234567891.123456
_Real10_a22    dt -12345678912.123456
_Real10_a23    dt -123456789123.123456
_Real10_a24    dt -1234567891234.123456
_Real10_a25    dt -12345678912345.123456
_Real10_a26    dt -123456789123456.123456
_Real10_a27    dt -1234567891234567.123456
_Real10_a28    dt -12345678912345678.123456
_Real10_a29    dt -123456789123456789.123456

_Real10_111    dt -1.1
_Real10_112    dt -11.1
_Real10_113    dt -111.1
_Real10_114    dt -1111.1
_Real10_115    dt -11111.1
_Real10_116    dt -111111.1
_Real10_117    dt -1111111.1
_Real10_118    dt -11111111.1 ; = 1.0 E+08 = 100 000 000.0
_Real10_119    dt -111111111.1
_Real10_120    dt -1111111111.1
_Real10_121    dt -11111111111.1
_Real10_122    dt -111111111111.1
_Real10_123    dt -1111111111111.1
_Real10_124    dt -11111111111111.1
_Real10_125    dt -111111111111111.1
_Real10_126    dt -1111111111111111.1
_Real10_127    dt -11111111111111111.1
_Real10_128    dt -111111111111111111.1


_Real10_211    dt -2.2
_Real10_212    dt -22.2
_Real10_213    dt -222.2
_Real10_214    dt -2222.2
_Real10_215    dt -22222.2
_Real10_216    dt -222222.2
_Real10_217    dt -2222222.2
_Real10_218    dt -22222222.2 ; = 1.0 E+08 = 100 000 000.0
_Real10_219    dt -222222222.2
_Real10_220    dt -2222222222.2
_Real10_221    dt -22222222222.2
_Real10_222    dt -222222222222.2
_Real10_223    dt -2222222222222.2
_Real10_224    dt -22222222222222.2
_Real10_225    dt -222222222222222.2
_Real10_226    dt -2222222222222222.2
_Real10_227    dt -22222222222222222.2
_Real10_228    dt -222222222222222222.2

_Real10_311    dt -3.3
_Real10_312    dt -33.3
_Real10_313    dt -333.3
_Real10_314    dt -3333.3
_Real10_315    dt -33333.3
_Real10_316    dt -333333.3
_Real10_317    dt -3333333.3
_Real10_318    dt -33333333.3 ; = 1.0 E+08 = 100 000 000.0
_Real10_319    dt -333333333.3
_Real10_320    dt -3333333333.3
_Real10_321    dt -33333333333.3
_Real10_322    dt -333333333333.3
_Real10_323    dt -3333333333333.3
_Real10_324    dt -33333333333333.3
_Real10_325    dt -333333333333333.3
_Real10_326    dt -3333333333333333.3
_Real10_327    dt -33333333333333333.3
_Real10_328    dt -333333333333333333.3

_Real10_411    dt -4.4
_Real10_412    dt -44.4
_Real10_413    dt -444.4
_Real10_414    dt -4444.4
_Real10_415    dt -44444.4
_Real10_416    dt -444444.4
_Real10_417    dt -4444444.4
_Real10_418    dt -44444444.4 ; = 1.0 E+08 = 100 000 000.0
_Real10_419    dt -444444444.4 ; = 1.0 E+08 = 100 000 000.0
_Real10_420    dt -4444444444.4
_Real10_421    dt -44444444444.4
_Real10_422    dt -444444444444.4
_Real10_423    dt -4444444444444.4
_Real10_424    dt -44444444444444.4
_Real10_425    dt -444444444444444.4
_Real10_426    dt -4444444444444444.4
_Real10_427    dt -44444444444444444.4
_Real10_428    dt -444444444444444444.4

_Real10_511    dt -5.5
_Real10_512    dt -55.5
_Real10_513    dt -555.5
_Real10_514    dt -5555.5
_Real10_515    dt -55555.5
_Real10_516    dt -555555.5
_Real10_517    dt -5555555.5
_Real10_518    dt -55555555.5 ; = 1.0 E+08 = 100 000 000.0
_Real10_519    dt -555555555.5
_Real10_520    dt -5555555555.5
_Real10_521    dt -55555555555.5
_Real10_522    dt -555555555555.5
_Real10_523    dt -5555555555555.5
_Real10_524    dt -55555555555555.5
_Real10_525    dt -555555555555555.5
_Real10_526    dt -5555555555555555.5
_Real10_527    dt -55555555555555555.5
_Real10_528    dt -555555555555555555.5

_Real10_611    dt -6.6
_Real10_612    dt -66.6
_Real10_613    dt -666.6
_Real10_614    dt -6666.6
_Real10_615    dt -66666.6
_Real10_616    dt -666666.6
_Real10_617    dt -6666666.6
_Real10_618    dt -66666666.6 ; = 1.0 E+08 = 100 000 000.0
_Real10_619    dt -666666666.6 ; = 1.0 E+08 = 100 000 000.0
_Real10_620    dt -6666666666.6
_Real10_621    dt -66666666666.6
_Real10_622    dt -666666666666.6
_Real10_623    dt -6666666666666.6
_Real10_624    dt -66666666666666.6
_Real10_625    dt -666666666666666.6
_Real10_626    dt -6666666666666666.6
_Real10_627    dt -66666666666666666.6
_Real10_628    dt -666666666666666666.6

_Real10_711    dt -7.7
_Real10_712    dt -77.7
_Real10_713    dt -777.7
_Real10_714    dt -7777.7
_Real10_715    dt -77777.7
_Real10_716    dt -777777.7
_Real10_717    dt -7777777.7
_Real10_718    dt -77777777.7 ; = 1.0 E+08 = 100 000 000.0
_Real10_719    dt -777777777.7
_Real10_720    dt -7777777777.7
_Real10_721    dt -77777777777.7
_Real10_722    dt -777777777777.7
_Real10_723    dt -7777777777777.7
_Real10_724    dt -77777777777777.7
_Real10_725    dt -777777777777777.7
_Real10_726    dt -7777777777777777.7
_Real10_727    dt -77777777777777777.7
_Real10_728    dt -777777777777777777.7

_Real10_811    dt -8.8
_Real10_812    dt -88.8
_Real10_813    dt -888.8
_Real10_814    dt -8888.8
_Real10_815    dt -88888.8
_Real10_816    dt -888888.8
_Real10_817    dt -8888888.8
_Real10_818    dt -88888888.8 ; = 1.0 E+08 = 100 000 000.0
_Real10_819    dt -888888888.8 ; = 1.0 E+08 = 100 000 000.0
_Real10_820    dt -8888888888.8
_Real10_821    dt -88888888888.8
_Real10_822    dt -888888888888.8
_Real10_823    dt -8888888888888.8
_Real10_824    dt -88888888888888.8
_Real10_825    dt -888888888888888.8
_Real10_826    dt -8888888888888888.8
_Real10_827    dt -88888888888888888.8
_Real10_828    dt -888888888888888888.8

_Real10_911    dt -9.9
_Real10_912    dt -99.9
_Real10_913    dt -999.9
_Real10_914    dt -9999.9
_Real10_915    dt -99999.9
_Real10_916    dt -999999.9
_Real10_917    dt -9999999.9
_Real10_918    dt -99999999.9 ; = 1.0 E+08 = 100 000 000.0
_Real10_919    dt -999999999.9 ; = 1.0 E+08 = 100 000 000.0
_Real10_920    dt -9999999999.9
_Real10_921    dt -99999999999.9
_Real10_922    dt -999999999999.9
_Real10_923    dt -9999999999999.9
_Real10_924    dt -99999999999999.9
_Real10_925    dt -999999999999999.9
_Real10_926    dt -9999999999999999.9
_Real10_927    dt -99999999999999999.9
_Real10_928    dt -999999999999999999.9


_Real10_011    dt  0.1
_Real10_012    dt  0.01
_Real10_013    dt  0.001
_Real10_014    dt  0.0001
_Real10_015    dt  0.00001
_Real10_016    dt  0.000001
_Real10_017    dt  0.0000001   ; dá = a 16    ; 1.0 E-7
_Real10_018    dt  0.00000001                 ; 1.0 E-8
_Real10_019    dt  0.000000001                ; 1.0 E-9
_Real10_0110   dt  0.0000000001
_Real10_0111   dt  0.00000000001
_Real10_0112   dt  0.000000000001
_Real10_0113   dt  0.0000000000001
_Real10_0114   dt  0.00000000000001
_Real10_0115   dt  0.000000000000001
_Real10_0116   dt  0.0000000000000001
_Real10_0117   dt  0.00000000000000001
_Real10_0118   dt  0.000000000000000001


_Real10_021    dt  0.2
_Real10_022    dt  0.02
_Real10_023    dt  0.002
_Real10_024    dt  0.0002
_Real10_025    dt  0.00002
_Real10_026    dt  0.000002
_Real10_027    dt  0.0000002
_Real10_028    dt  0.00000002
_Real10_029    dt  0.000000002
_Real10_0210   dt  0.0000000002
_Real10_0211   dt  0.00000000002
_Real10_0212   dt  0.000000000002
_Real10_0213   dt  0.0000000000002
_Real10_0214   dt  0.00000000000002
_Real10_0215   dt  0.000000000000002
_Real10_0216   dt  0.0000000000000002
_Real10_0217   dt  0.00000000000000002
_Real10_0218   dt  0.000000000000000002

_Real10_031    dt  0.3
_Real10_032    dt  0.03
_Real10_033    dt  0.003
_Real10_034    dt  0.0003
_Real10_035    dt  0.00003
_Real10_036    dt  0.000003
_Real10_037    dt  0.0000003
_Real10_038    dt  0.00000003
_Real10_039    dt  0.000000003
_Real10_0310   dt  0.0000000003
_Real10_0311   dt  0.00000000003
_Real10_0312   dt  0.000000000003
_Real10_0313   dt  0.0000000000003
_Real10_0314   dt  0.00000000000003
_Real10_0315   dt  0.000000000000003
_Real10_0316   dt  0.0000000000000003
_Real10_0317   dt  0.00000000000000003
_Real10_0318   dt  0.000000000000000003

_Real10_041    dt  0.4
_Real10_042    dt  0.04
_Real10_043    dt  0.004
_Real10_044    dt  0.0004
_Real10_045    dt  0.00004
_Real10_046    dt  0.000004
_Real10_047    dt  0.0000004
_Real10_048    dt  0.00000004
_Real10_049    dt  0.000000004
_Real10_0410   dt  0.0000000004
_Real10_0411   dt  0.00000000004
_Real10_0412   dt  0.000000000004
_Real10_0413   dt  0.0000000000004
_Real10_0414   dt  0.00000000000004
_Real10_0415   dt  0.000000000000004
_Real10_0416   dt  0.0000000000000004
_Real10_0417   dt  0.00000000000000004
_Real10_0418   dt  0.000000000000000004

_Real10_051    dt  0.5
_Real10_052    dt  0.05
_Real10_053    dt  0.005
_Real10_054    dt  0.0005
_Real10_055    dt  0.00005
_Real10_056    dt  0.000005
_Real10_057    dt  0.0000005
_Real10_058    dt  0.00000005
_Real10_059    dt  0.000000005
_Real10_0510   dt  0.0000000005
_Real10_0511   dt  0.00000000005
_Real10_0512   dt  0.000000000005
_Real10_0513   dt  0.0000000000005
_Real10_0514   dt  0.00000000000005
_Real10_0515   dt  0.000000000000005
_Real10_0516   dt  0.0000000000000005
_Real10_0517   dt  0.00000000000000005
_Real10_0518   dt  0.000000000000000005

_Real10_061    dt  0.6
_Real10_062    dt  0.06
_Real10_063    dt  0.006
_Real10_064    dt  0.0006
_Real10_065    dt  0.00006
_Real10_066    dt  0.000006
_Real10_067    dt  0.0000006
_Real10_068    dt  0.00000006
_Real10_069    dt  0.000000006
_Real10_0610   dt  0.0000000006
_Real10_0611   dt  0.00000000006
_Real10_0612   dt  0.000000000006
_Real10_0613   dt  0.0000000000006
_Real10_0614   dt  0.00000000000006
_Real10_0615   dt  0.000000000000006
_Real10_0616   dt  0.0000000000000006
_Real10_0617   dt  0.00000000000000006
_Real10_0618   dt  0.000000000000000006

_Real10_071    dt  0.7
_Real10_072    dt  0.07
_Real10_073    dt  0.007
_Real10_074    dt  0.0007
_Real10_075    dt  0.00007
_Real10_076    dt  0.000007
_Real10_077    dt  0.0000007
_Real10_078    dt  0.00000007
_Real10_079    dt  0.000000007
_Real10_0710   dt  0.0000000007
_Real10_0711   dt  0.00000000007
_Real10_0712   dt  0.000000000007
_Real10_0713   dt  0.0000000000007
_Real10_0714   dt  0.00000000000007
_Real10_0715   dt  0.000000000000007
_Real10_0716   dt  0.0000000000000007
_Real10_0717   dt  0.00000000000000007
_Real10_0718   dt  0.000000000000000007

_Real10_081    dt  0.8
_Real10_082    dt  0.08
_Real10_083    dt  0.008
_Real10_084    dt  0.0008
_Real10_085    dt  0.00008
_Real10_086    dt  0.000008
_Real10_087    dt  0.0000008
_Real10_088    dt  0.00000008
_Real10_089    dt  0.000000008
_Real10_0810   dt  0.0000000008
_Real10_0811   dt  0.00000000008
_Real10_0812   dt  0.000000000008
_Real10_0813   dt  0.0000000000008
_Real10_0814   dt  0.00000000000008
_Real10_0815   dt  0.000000000000008
_Real10_0816   dt  0.0000000000000008
_Real10_0817   dt  0.00000000000000008
_Real10_0818   dt  0.000000000000000008

_Real10_091    dt  0.9
_Real10_092    dt  0.09
_Real10_093    dt  0.009
_Real10_094    dt  0.0009
_Real10_095    dt  0.00009
_Real10_096    dt  0.000009
_Real10_097    dt  0.0000009
_Real10_098    dt  0.00000009
_Real10_099    dt  0.000000009
_Real10_0910   dt  0.0000000009
_Real10_0911   dt  0.00000000009
_Real10_0912   dt  0.000000000009
_Real10_0913   dt  0.0000000000009
_Real10_0914   dt  0.00000000000009
_Real10_0915   dt  0.000000000000009
_Real10_0916   dt  0.0000000000000009
_Real10_0917   dt  0.00000000000000009
_Real10_0918   dt  0.000000000000000009
;-----------------------------------------
_Real10e60     dt 1.2345e+60
_Real10e61     dt 1.2345e+61
_Real10e62     dt 1.2345e+62
_Real10e63     dt 1.2345e+63

_Real10e_60    dt 1.2345e-60
_Real10e_61    dt 1.2345e-61
_Real10e_62    dt 1.2345e-62
_Real10e_63    dt 1.2345e-63

_Real10e70     dt 1.2345e+70
_Real10e71     dt 1.2345e+71
_Real10e72     dt 1.2345e+72
_Real10e73     dt 1.2345e+73

_Real10e_50    dt 1.2345e-50
_Real10e_51    dt 1.2345e-51
_Real10e_52    dt 1.2345e-52
_Real10e_53    dt 1.2345e-53


and this in the .asm file

_result         db 32 dup (0)
_DataCounter    dd 0
_DataPointer    dd offset _Real10D_00   ; starts in this string
.code
main proc

        @@:     mov     ecx, _DataCounter
                mov     eax, 10
                mul     ecx
                mov     edi, _DataPointer
                add     edi, eax
                cmp     edi, offset _Real10e_53    ; end in this string
                ja      @F
                ;               
                push offset _result
    push edi
    call Eprst
          print ADDR _result,13,10
          inkey " *** STOP ----*** "

                add     _DataCounter, 1
                jmp     @B               
        @@:


and i got this:

+0.0
*** STOP ----***
1,000000000000000000E-0001
*** STOP ----***
2,000000000000000000E-0001
*** STOP ----***
3,000000000000000000E-0001
*** STOP ----***
4,000000000000000000E-0001
*** STOP ----***
5,000000000000000000E-0001
*** STOP ----***
6,000000000000000000E-0001
*** STOP ----***
7,000000000000000000E-0001
*** STOP ----***
8,000000000000000000E-0001
*** STOP ----***
9,000000000000000000E-0001
*** STOP ----***
1,000000000000000000E+0000
*** STOP ----***
2,000000000000000000E+0000
*** STOP ----***
Error
*** STOP ----***
4,000000000000000000E+0000
*** STOP ----***
5,000000000000000000E+0000
*** STOP ----***
Error
*** STOP ----***
Error
*** STOP ----***
8,000000000000000000E+0000
*** STOP ----***
9,000000000000000000E+0000
*** STOP ----***
-1,234567891234560000E+0000
*** STOP ----***
Error
*** STOP ----***
Error
*** STOP ----***
-1,234567891234560000E+0003
*** STOP ----***
Error
*** STOP ----***


The problem seems to be in "imul"

well, this table is this:
                  dd 0             ; start with 0 => no values in the table           
_TblTiming0 dd 60 dup (?)   ; calling SaveTiming it goes to 1, next 2, next 3, etc.

Mikl__

#53
Hi, RuiLoureiro, dedndave!
I wrote in Reply #49 "raw" code or naked idea, I will now chase the code on your data and correct errors. Thank you very much for your help and advice!
Eu escrevi que este código "cru" ou idéia "nua", agora eu vai perseguir o código em seus dados e corrigir erros. Muito obrigado por sua ajuda e conselhos!

RuiLoureiro

#54
Hi Mikl,
      i appreciate your work till now
      We know that you are trying another version
      with a new magic number.
      I wrote this with magic1X = 1292913987 = log(2)*2^32
      «
         invoke    ConvertReal10KK, pReal10, pStr
         pReal = Real10 pointer
         pStr  = String pointer
      »
      note 1: copy all and paste it into an asm file in
                   the correct position. I think it works
      note 2: see the code after the word "start"

      It is not better than the old code with magic1.
     
      I wrote also a version with your old «magic1 = 4D10h = log(2)*2^16»
      and «sar  edx, 16» and not «sar edx, 14».
     
      I wrote it based on your code
      Thanks for this  :t
      (obrigado por isso)

EDIT 1: one bug corrected

EDIT 2:
Please, replace this:
Quote
    _isinfinity: and      eax, 80000000h
                    jz       short _erro1       ; is invalid

by this:
Quote
    _isinfinity: or       eax, ebx
                    cmp      eax, 80000000h
                    jne      short _erro1               ; is NAN


comment * ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
Here, the info given by DAVE

REAL10
  Exponent                     Significand                  Meaning

    0000       0000_0000_0000_0000                          Signed Zero
               0000_0000_0000_0001 to 7FFF_FFFF_FFFF_FFFF   Signed Denormal
               8000_0000_0000_0000 to FFFF_FFFF_FFFF_FFFF   Signed Pseudo-Denormal

0001 to 7FFE   0000_0000_0000_0000 to 7FFF_FFFF_FFFF_FFFF   Invalid
               8000_0000_0000_0000 to FFFF_FFFF_FFFF_FFFF   Signed Normal

    7FFF       0000_0000_0000_0000 to 7FFF_FFFF_FFFF_FFFF   Invalid
               8000_0000_0000_0000                          Signed Infinity
               8000_0000_0000_0001 to BFFF_FFFF_FFFF_FFFF   Signaling NaN
               C000_0000_0000_0000                          Indefinite Quiet NaN
               C000_0000_0000_0001 to FFFF_FFFF_FFFF_FFFF   Quiet NaN
               
          ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ *

; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
    dp_1    equ 17      ; = decimal places minus 1
    dp4     equ dp_1+4

        _shifttableK    dd _shift0K    ; +0
                        dd _shift1K    ; +4
                        dd _shift2K    ; +8
                        dd _shift3K    ;+12
                        dd _shift4K    ;+16

; Process only: Zero, Infinity, Denormal and Normal
; All other:    Error
; The main code was given by Mikl
ConvertReal10KK         proc     pReal10:DWORD, pStr:DWORD
                        LOCAL    iExp       :DWORD
                        LOCAL    aExp       :DWORD
                        LOCAL    realx[3]   :DWORD
                        LOCAL    temp1      :DWORD
                        LOCAL    temp2      :DWORD
                        ;
                        push     ebx
                        push     esi
                        push     edi

                        ;finit

                  mov     edi, pStr
                        mov     ecx, pReal10
                  fld     tbyte ptr [ecx]

                  mov     aExp, 0

                        ; ---------------------------
                        ;    move real10 to realx
                        ; if iExp=0 we use this realx
                        ; ---------------------------
                  mov     ebx, [ecx+0]
                  mov     eax, [ecx+4]
                  movzx   edx, word ptr [ecx+8]

                  mov     [realx+0], ebx
                  mov     [realx+4], eax
                  mov     [realx+8], edx

                  and     edx, 7FFFh        ; remove sign
                  jnz     short _expnotzero               

                        ; ------------------------
                        ;       exponent = 0
                        ; ------------------------
                        or      ebx, eax
                        jz      _iszero
                       
                        ;-------------------------
                        ;    It is Denormal or
                        ;     Pseudo-Denormal
                        ;-------------------------
                        fld     _realexp4931     ; st(0)=1.0e+4931
                  mov     aExp,-4931
                  fmul                     ; normalization
                  fld     st               ; get a copy
                  fstp    tbyte ptr realx
                        ;
                  mov     ebx, [realx+0]
                  mov     eax, [realx+4]
                  mov     edx, [realx+8]
                  jmp     short @F

        _expnotzero:    cmp     edx, 7FFFh
                  je      _isinfinity
                        ;
                        ;
                        ;
                        and     eax, 80000000h
                        jz      _erro1
                       
                        ;---------------------
                        ;       start
                        ;---------------------
                @@:     mov     al, ' '
                        test    [realx+8], 8000h
                        jz      short @F
                        mov     al, '-'
                @@:     mov     [edi], al
               
                        mov     esi, 10
                  mov     eax, magic1X    ; = 1292913987 = log(2)*2^32
                                                   
                        ;----------------------------------
                        ;----------------------------------
                  sub     edx, 3FFFh
                        js      short _expisneg
                        ;
                        mul     edx
                  mov     iExp, edx
                  jz      _getrealx            ; If iExp=0 => use realx
                        jmp     short _getexp

        _expisneg:      neg     edx
                        mul     edx
                        neg     edx
                        add     edx, -1
                        mov     iExp, edx
        _getexp:                                     
                  cmp     edx, $maxexp
                  jg      a1
                  cmp     edx,-$maxexp
                  jge     short _load
;------------------------------------------------
                 a1:    neg     edx
                  mov     temp1, edx           

                        ; ---------------------
                        ;       temp2=
                        ; (log2(10)*2^16)/2^16
                        ; ---------------------
                  imul    edx, magic2          ; = 217705
                  sar     edx, 16
                  mov     temp2, edx

                  fild    temp2       ; get the characteristic
                  fild    temp1       ; log2(10)*expscale
                        ;
                  fldl2t   ; log2(10)
                        fmul                ; log2(10)*expscale
                           
                        fsub    st,st(1) ; get only the mantissa but keep the characteristic
                        f2xm1                   ; 2^(mantissa)-1
                        fld1
                        fadd                    ; add 1 and pop
                        fscale
                        fstp    st(1)           ; remove the characteristic
                        jmp     short @F        ;_multiply
                       
;--------------------------------------------------------       
            _load: sal     edx, 4
                        fld     [_PowerTable16+edx]
;--------------------------------------------------------               

                @@:     fmul                    ; X * 10^expscaleS = d.??????
             
                  fld      st              ; get a copy
                  fstp     tbyte ptr realx
                  xor      edx, edx

                        ; ----------------------------
                        ;  fraction bits in EAX:EBX
                        ; ----------------------------
        _getrealx:      mov      ecx, [realx+8]
                  mov      ebx, [realx+0]
                        mov      eax, [realx+4]
                        ;
                  and      ecx, 7FFFh
                  sub      ecx, 16382      ; 10=> exponent = 16386

                  cmp      ecx, 4
                  ja       _shift0L
                  jmp      [_shifttableK+ecx*4]

           _shift4K::   test     eax, 60000000h     ; 6= 0110B
                  jz       short a6

                  fld      [_PowerTable16+16]          ; = 0.1
                  fmul
                  add      iExp, 1

                  fld      st                  ; NEW --- get a copy
                  fstp     tbyte ptr realx

                  mov      eax, [realx+4]
                        mov      ebx, [realx+0]

                        ; -------------------------------
                        ;    fraction bits in EAX:EBX
                        ;    shift: EDX <- EAX <- EBX
                        ; -------------------------------                           
                  shld     edx, eax,1
                  shld     eax, ebx,1
                  shl      ebx, 1
                  add      ebx, 4
                  jmp      _shift0K

                a6: shld     edx, eax, 4        ;ecx=1 ebx+4
                  shld     eax, ebx, 4        ;ecx=2 ebx+8
                  shl      ebx, 4             ;ecx=3 ebx+9
                  add      ebx, 12            ;ecx=4 ebx+12
                  jmp      _shift0K

                        ; -------------------------------
                        ;    fraction bits in EAX:EBX
                        ;    shift: EDX <- EAX <- EBX
                        ; -------------------------------
           _shift3K::   shld     edx, eax, 3
                  shld     eax, ebx, 3
                  shl      ebx, 3              ; * 8
                  add      ebx, 9    ;10
                  jmp      _shift0K

                        ; -------------------------------
                        ;    fraction bits in EAX:EBX
                        ;    shift: EDX <- EAX <- EBX
                        ; -------------------------------
           _shift2K::   shld     edx, eax, 2
                  shld     eax, ebx, 2
                  shl      ebx, 2              ; * 4
                  add      ebx, 8
                  jmp      _shift0K

                        ; -------------------------------
                        ;    fraction bits in EAX:EBX
                        ;    shift: EDX <- EAX <- EBX
                        ; -------------------------------
           _shift1K::   shld     edx, eax, 1
                  shld     eax, ebx, 1
                  shl      ebx, 1              ; * 2
                  add      ebx, 4
;-------------------------------------------------------
                        ; -------------------------------
                        ;  fraction bits in EDX:EAX:EBX
                        ; -------------------------------
           _shift0K::   adc      eax, 0             ; add carry to eax and edx
                  adc      edx, 0
                        ;
                  mov      [edi+1], dl
                  mov      byte ptr [edi+2],'.'
                  or       byte ptr [edi+1],'0'
                        ;------------------------------------------------
                        ;            bit f1 is bit 31 in eax
                        ;
                        ;                 eax          ebx
                        ;                               10 (first by eax)
                        ;      ----------------------------
                        ;         edx     ecx
                        ;                 edx          eax
                        ;    ++++++++++++++++++++++++++++++
                        ;   edx+carry     ecx          ebx
                        ;------------------------------------------------
                    k=3
                        REPEAT dp_1
                            mul     esi             ; edx:eax=eax*10
                            mov     [edi+k], dl     ; save DL
                            mov     ecx, eax        ; save EAX in ecx
                            ;
                            mov     eax, ebx
                            mul     esi             ; ebx=ebx*10
                            add     ecx, edx
                            adc     byte ptr [edi+k],'0'
                            ;
                            mov     ebx, eax        ; new ebx
                            mov     eax, ecx        ; new eax
                    k=k+1
                        ENDM

                  mul      esi
                  mov      [edi+k], dl
                  mov      ecx, eax            ; save ecx
                        ;
                  mov      eax, ebx
                  mul      esi
                  add      ecx, edx
                  adc      byte ptr [edi+k],'0'

                        add      edi, dp4
                        jmp      short _removeD
                       
                        ; ------------------
                        ; remove last zeroes
                        ; ------------------
                @@:     sub     edi, 1
            _removeD:   movzx   eax, word ptr [edi-2]
                        cmp     al, '.'
                        je      _finish0
                        ;
                        cmp     ah, '0'
                        je      short @B

            _finish0:                       
;---------------------------------------------------------
                  mov      eax, iExp
                  add      eax, aExp
                        jz       short _finish      ; if exp=0 jump

                        EXPONENTREAL_10K

            _finish:    mov      eax, edi
                        mov      edi, pStr
                        sub      eax, edi           

            _exit0:     ;mov      dword ptr [edi-4], eax
                        mov      byte ptr [edi+eax], 0

                        fstp     st(0)                      ; remove realx
                                             
                        xor      eax, eax
                        clc
            _exit:      pop      edi
                        pop      esi
                        pop      ebx
                        ret
;-----------------------------------------------------------
    _isinfinity:        and      eax, 80000000h
                        jz       short _erro1       ; is invalid
                       
                        mov      al, '+'
                        mov      edx, [realx+8]
                        and      edx, 8000h
                        jz       short @F
                        mov      al, '-'
                         
                @@:     mov      byte ptr [edi], al
                        mov      dword ptr [edi+1], "IFNI"
                        mov      dword ptr [edi+5], "YTIN"
                        mov      eax, 9

                        ;fstp     st(0)                      ; remove realx
                        jmp      _exit0
                   
                        ;--------------------------
                        ; value to be converted = 0
                        ;--------------------------
        _iszero:        ;fstp     st(0)                      ; remove realx
                        mov      word ptr [edi], 3020h
                        mov      eax, 2
                        jmp      _exit0
                   
                        ; --------------------
                        ; is indefinite or NAN
                        ; --------------------
        _erro1:         mov      eax, 1
       
                        ; -------------------
                        ; -------------------
        _error:         fstp     st(0)                      ; remove realx
       
                        mov      dword ptr [edi+0], "ORRE"
                        mov      byte ptr [edi+4], "R"
                        ;
                        mov      dword ptr [edi-4], 5
                        mov      byte ptr [edi+5], 0
                        stc
                        jmp      _exit                                       
ConvertReal10KK         endp
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
EXPONENTREAL_10K MACRO
; The main code was given by Dave

                mov     bx, '+e'

                or      eax, eax
                jns     short @F
               
                mov     bx, '-e'
                neg     eax                     ; make number positive
        @@:     
                mov     word ptr [edi], bx

                ;EAX = 0 to 9999

                mov     edx,4294968          ;2^32/1000
                mov     ebx,10               ;per digit
                mul     edx                  ;extend first digit
                mov     ecx,edx              ;digit 1 in CL
                mul     ebx                  ;second digit
                mov     ch,dl                ;digit 2 in CH
                mul     ebx                  ;third digit
                bswap   ecx                  ;digits 1 & 2 up high
                mov     ch,dl                ;digit 3 in CH
                mul     ebx                  ;digit 4 in DL
                lea     ecx,[edx+ecx+'0000'] ;combine and make ASCII
                bswap   ecx                  ;re-order bytes
                ; ----------------------
                ; ECX = "0000" to "9999"
                ; ----------------------
                mov     [edi+2], ecx
                add     edi, 6                   
ENDM


Table of powers

magic2  equ 35269h

$maxexp     equ 90
$maxcounter equ 2*$maxexp+1
;---------------------------------------------
.data
_realexp4931    dt 1.0e+4931

;---------------------------------------------
    ; for 12 bytes
   
    cntr = -$maxexp
    REPEAT $maxcounter
        IF cntr NE 0
            dt @CatStr(<1.0e>,%-cntr)
        ELSE
_PowerTable12  dt 1.0
        ENDIF
            dw 0
        cntr = cntr + 1
    ENDM
;---------------------------------------------
    ; for 16 bytes
   
    cntr = -$maxexp
    REPEAT $maxcounter
        IF cntr NE 0
            dt @CatStr(<1.0e>,%-cntr)
        ELSE
_PowerTable16  dt 1.0
        ENDIF
            dw 0,0,0
        cntr = cntr + 1
    ENDM
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

Mikl__

Hi, RuiLoureiro!
Eprst.asm;---------------------------------------------------------------
;constats
$max equ 90; <-- This number may be increased
magic1 equ 4D104D42h;lg(2)*4294967296=1292913986,4918210386020002827249...
magic2  equ 35269h;log2(10)*65536=3,32192809488736234780*65536=217705,8796265381788254208..
;---------------------------------------------------------------
.data
ALIGN 16
    cntr = -$max
    REPEAT 2*$max+1
        IF cntr NE 0
            REAL10 @CatStr(<1.0e>,%-cntr)
        ELSE
            tabs REAL10 1.0
        ENDIF
dw 0,0,0
        cntr = cntr + 1
    ENDM
ALIGN 16
max_ten REAL10 1.0e+4931
align 16
    table0  label word
n = 0
rept 100
dd (n mod 10 shl 8)+(n/10)+"00"
n = n + 1
endm   
ALIGN 16
table1 dd shift0, shift1, shift2, shift3, shift4
table4 dd shift00, shiftcl, shiftcl, shiftcl, shift40
;---------------------------------------------------------
table2 dd 8 dup(Error),PNormal,PNormal2,Error,PNormal2,2 dup(PNormal),Error,PNormal,2 dup(Error)
;         0-7,         8,      9,       0Ah,  0Bh,     0Ch,0Dh,       0Eh,  0Fh,    10h,11h
dd PDenormal2,PZero,PDenormal,(27h-15h+1)dup(Error),PSNan,Error,PSNan,PInfinity,PQNaN,Error,Error,PQNaN,(3Fh-30h+1)dup(Error)
;  12h,       13h,  14h,       15h-27h,             28h,  29h,  2Ah,  2Bh,      2Ch,   2Dh,2Eh,   2Fh,   30h-3Fh,
dd        8 dup(Error),NNormal,NNormal2,Error,NNormal2,2 dup(NNormal),Error,PNormal,2 dup(Error)
;         40h-47h,     48h,    49h,     4Ah,  4Bh,     4Ch,4Dh        4Eh   4Fh,    50h,51h
dd NDenormal2,NZero,NDenormal,(67h-55h+1)dup(Error),NSNan,Error,NSNan,NInfinity,NQNaN,Error,Error,NQNaN,(7Fh-70h+1)dup(Error)
;  52h,       53h,  54h,       55h-67h,             68h,  69h,  6Ah,  6Bh,      6Ch,  6Dh,6Eh,    6Fh,   70h-7Fh
;-----------------------------------------------------
.code
;================================================
Eprst proc

lpReal11 equ dword ptr [esp+16+buffer]
lpDest equ lpReal11+4
iExp equ dword ptr [esp-4] ;+0
aExp equ iExp-4;dword      ;+4
x equ aExp-4*3;12 bytes ;+8
temp1 equ x-4;dword         ;+20
temp2 equ temp1-4;dword     ;+2
;temp3 equ temp2-4
buffer = 1Ch;+4

push edi
push esi
push ebx
sub esp,buffer
fninit
        mov ecx,lpReal11
fld tbyte ptr [ecx]
mov edi,lpDest
mov ebx,[ecx]
mov esi,[ecx+4]
xor eax,eax
mov [x],ebx
mov ax,word ptr [ecx+8]
mov aExp,0
mov [x+4],esi
mov [x+8],eax
mov edx,[ecx+6]
xor eax,eax
shl edx,1
adc eax,0; 1-st bit is sign
add edx,20000h
adc eax,eax; 2-nd bit is exp=7FFF
        sub edx,20000h
xor edx,0FFFE0000h
add edx,20000h
adc eax,eax; 3-th bit is exp=0
shld eax,esi,2; 4-th bit is j 5-th bit is f[62]
shl esi,2
not esi
not ebx
add esi,1
adc eax,eax; 6-th bit is f[61:32]=0
add ebx,1
adc eax,eax; 7-th bit is f[31:0]=0
jmp table2[eax*4]
ALIGN 16
NDenormal2::mov byte ptr [edi],'-'
jmp @f
ALIGN 16
PDenormal2::mov byte ptr [edi],' '
@@: mov edx,[x]
fld max_ten  ;st(0)=1.0e+4931
mov aExp,-4931*2
bsr edx,edx
;-------------------------------------------
; fild qword ptr [x]
;       fstp tbyte ptr [x]
; mov edx,[x+8]
; sub edx,16382
;--------------------------------
mov eax,magic1
imul edx
add edx,-20
add edx,edx
fmul
        fld tabs[edx*8];max_ten2; 1.0e+20
fmul                  ;normalization
add aExp,edx
fld st
fstp tbyte ptr x
mov ebx,[x]
mov eax,[x+4]
mov edx,[x+8]
jmp a2
ALIGN 16
NDenormal::mov byte ptr [edi],'-'
jmp @f
ALIGN 16
PDenormal::mov byte ptr [edi],' '
@@: fld max_ten  ;st(0)=1.0e+4931
mov edx,[x+4]
mov aExp,-4931*2
bsr edx,edx
add edx,32
mov eax,magic1
imul edx
add edx,-19
add edx,edx
fmul
        fld tabs[edx*8]
fmul                  ;normalization
add aExp,edx
fld st
fstp tbyte ptr x
mov ebx,[x]
mov eax,[x+4]
mov edx,[x+8]
jmp a2;PNormal
ALIGN 16
NNormal::mov byte ptr [edi],'-'
jmp a2;@f
ALIGN 16
PNormal::mov byte ptr [edi],' '
a2: mov edx,[x+8]
mov eax,magic1
and edx,7FFFh ;fabs
mov esi,10
sub edx,16383
mov word ptr [edi+21],'+E'
imul edx
add edx,edx
mov iExp,edx
jz @f
cmp edx,2*$max
jg a1
cmp edx,-2*$max
jge load
;------------------------------------------------
sub edx,1
a1: neg edx;
sar edx,1
mov temp1,edx
imul edx,magic2
sar edx,16
mov temp2,edx
fild temp2         ; get the characteristic
fild temp1         ; log2(10)*expscale
fldl2t    ; log2(10)
        fmul               ; log2(10)*expscale
        fsub st,st(1)      ; get only the mantissa but keep the characteristic
        f2xm1              ; 2^(mantissa)-1
        fld1
        fadd               ; add 1 and pop
        fscale
        fstp    st(1)      ; remove the characteristic
        jmp multiply
ALIGN 16
load: fld tabs[edx*8];[edx+edx*4]
multiply:fmul              ; X * 10^expscaleS
fld st
fstp tbyte ptr x
xor edx,edx
@@: mov ecx,[x+8]
mov ebx,[x]
        mov eax,[x+4]
a5: and ecx,7FFFh
sub ecx,16382
cmp ecx,4
ja shift0
jmp table1[ecx*4]
ALIGN 16
shift4::test eax,60000000h
jz a6
fld tabs[16]
fmul
add iExp,2
fstp tbyte ptr x
mov eax,[x+4]
        mov ebx,[x]
shld edx,eax,1
shld eax,ebx,1
shl ebx,1
add ebx,4
jmp shift0
a6: shld edx,eax,4 ;ecx=1 ebx+4
shld eax,ebx,4 ;ecx=2 ebx+8
shl ebx,4      ;ecx=3 ebx+9
add ebx,12     ;ecx=4 ebx+12
jmp shift0
ALIGN 16
shift3::shld edx,eax,3
shld eax,ebx,3
shl ebx,3
add ebx,9;10
jmp shift0
ALIGN 16
shift2::shld edx,eax,2
shld eax,ebx,2
shl ebx,2
add ebx,8
jmp shift0
ALIGN 16
shift1::shld edx,eax,1
shld eax,ebx,1
shl ebx,1
add ebx,4
ALIGN 16
shift0::adc eax,0
adc edx,0
mov [edi+1],dl
mov byte ptr [edi+2],',';point
or byte ptr [edi+1],'0'
   
k=3
    REPEAT 17
        mul esi
        mov [edi+k],dl
        mov ecx,eax
        mov eax,ebx
        mul esi
        add ecx,edx
        adc byte ptr [edi+k],'0'
        mov ebx,eax
        mov eax,ecx
k=k+1
    ENDM

mul esi
mov [edi+k],dl
mov ecx,eax
mov eax,ebx
mul esi
add ecx,edx
adc byte ptr [edi+k],'0'
;--------------------------------------
mov eax,iExp
add eax,aExp
mov edx,eax
sar eax,1
sar edx,31
mov ecx,esi
xor eax,edx
sub eax,edx
and edx,2
add byte ptr [edi+22],dl
mov esi,eax
mov edx,42949673;2^32/100
mul edx
mov eax,dword ptr table0[edx*4] ;edx = quotient of the division by 100
mov dword ptr [edi+23],eax
lea eax,[edx*4];100 dec = 1100100 bin
shl edx,2
lea edx,[edx+edx*2]
lea edx,[eax+edx*8] ;edx = quotient*100
sub esi,edx;esi = remainder of the division by 100
mov eax,dword ptr table0[esi*4]
mov dword ptr [edi+25],eax
mov ebx,[esp+buffer];pop ebx
mov dword ptr [edi+27],0
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
retn 8
ALIGN 16
NNormal2::mov byte ptr [edi],'-'
jmp @f
ALIGN 16
PNormal2::mov byte ptr [edi],' '
@@: mov edx,[x+8]
mov eax,magic1
and edx,7FFFh ;fabs
mov esi,10
sub edx,16383
mov word ptr [edi+21],'+E'
imul edx
add edx,edx
mov iExp,edx
jz @f
cmp edx,2*$max
jg a4
cmp edx,-2*$max
jge load1
;------------------------------------------------
sub edx,1
a4: neg edx;
sar edx,1
mov temp1,edx
imul edx,magic2
sar edx,16
mov temp2,edx
fild temp2         ; get the characteristic
fild temp1         ; log2(10)*expscale
fldl2t    ; log2(10)
        fmul               ; log2(10)*expscale
        fsub st,st(1)      ; get only the mantissa but keep the characteristic
        f2xm1              ; 2^(mantissa)-1
        fld1
        fadd               ; add 1 and pop
        fscale
        fstp    st(1)      ; remove the characteristic
        jmp multiply1
ALIGN 16
load1: fld tabs[edx*8]
multiply1:fmul              ; X * 10^expscaleS
fld st
fstp tbyte ptr x
xor edx,edx
@@: mov ecx,[x+8]
mov ebx,[x]
        mov eax,[x+4]
test ebx,ebx
jnz a5
and ecx,7FFFh
sub ecx,16382
cmp ecx,4
ja shift00
jmp table4[ecx*4]
ALIGN 16
shift40::test eax,60000000h
jz shiftcl
fld tabs[16]
fmul
add iExp,2
fstp tbyte ptr x
mov eax,[x+4]
        mov ebx,[x]
shld edx,eax,1
shl eax,1
jmp shift00
shiftcl::shld edx,eax,cl ;ecx=1 ebx+4
shl eax,cl
ALIGN 16
shift00::mov [edi+1],dl
mov byte ptr [edi+2],',';point
or byte ptr [edi+1],'0'
   
k=3
    REPEAT 18
        mul esi
        mov [edi+k],dl
        add byte ptr [edi+k],'0'
k=k+1
    ENDM
;--------------------------------------
mov eax,iExp
add eax,aExp
mov edx,eax
sar eax,1
sar edx,31
mov ecx,esi
xor eax,edx
sub eax,edx
and edx,2
add byte ptr [edi+22],dl
mov esi,eax
mov edx,42949673;2^32/100
mul edx
mov eax,dword ptr table0[edx*4] ;edx = quotient of the division by 100
mov dword ptr [edi+23],eax
lea eax,[edx*4];100 dec = 1100100 bin
shl edx,2
lea edx,[edx+edx*2]
lea edx,[eax+edx*8] ;edx = quotient*100
sub esi,edx;esi = remainder of the division by 100
mov eax,dword ptr table0[esi*4]
mov dword ptr [edi+25],eax
mov ebx,[esp+buffer];pop ebx
mov dword ptr [edi+27],0
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
retn 8
NSNan:: mov dword ptr [edi],'giS-'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+4],' lan'
        mov dword ptr [edi+8],' noN'
        mov dword ptr [edi+12],'uN a'
        mov dword ptr [edi+16],'rebm'
        mov dword ptr [edi+20],0
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
retn 8
PSNan:: mov dword ptr [edi],'giS+'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+4],' lan'
        mov dword ptr [edi+8],' noN'
        mov dword ptr [edi+12],'uN a'
        mov dword ptr [edi+16],'rebm'
        mov dword ptr [edi+20],0
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
retn 8
        mov dword ptr [edi+1],'ecnU'
        mov dword ptr [edi+5],'iatr'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+9],'ytn'
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
ret 8
NQNaN:: mov dword ptr [edi],'iuQ-'
        mov dword ptr [edi+4],'N te'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+8],'a no'
        mov dword ptr [edi+12],'muN '
        mov dword ptr [edi+16],'reb'
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
ret 8
PQNaN:: mov dword ptr [edi],'iuQ+'
        mov dword ptr [edi+4],'N te'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+8],'a no'
        mov dword ptr [edi+12],'muN '
        mov dword ptr [edi+16],'reb'
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
ret 8
NInfinity::mov dword ptr [edi],'fnI-'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+4],'tini'
        mov dword ptr [edi+8],'y'
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
ret 8
PInfinity::mov dword ptr [edi],'fnI+'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+4],'tini'
        mov dword ptr [edi+8],'y'
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
ret 8
NZero:: mov dword ptr [edi],'0.0-'
mov ebx,[esp+buffer];pop ebx
mov dword ptr [edi+4],0
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
        retn 8
PZero:: mov dword ptr [edi],'0.0+'
mov ebx,[esp+buffer];pop ebx
mov dword ptr [edi+4],0
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
        retn 8
Error:: mov dword ptr [edi],'orrE'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+4],'r'
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
ret 8
Eprst endp

Mikl__

main.asm; masm windows console #
include \masm32\include\masm32rt.inc
include Test_data.inc
.686
.mmx
.xmm
;---------------------------------------------------------------
;macro
START_COUNTER_CYCLE_HIGH_PRIORITY_CLASS   MACRO         ;LoopCount, Priority
                      LOCAL   label

            IFNDEF __counter__stuff__defined__
                __counter__stuff__defined__ equ <1>
            .data
            ALIGN 8             ;; Optimal alignment for QWORD
            ; __counter__qword__count__  dq 0
            ; __counter__loop__count__   dd 0
            ; __counter__loop__counter__ dd 0

                _CounterQword   dq 0            ; __counter__qword__count__
                _LoopCount      dd 0            ; __counter__loop__count__
                _LoopCounter    dd 0            ; __counter__loop__counter__
                               
            .code
            ENDIF

            mov     _LoopCount, 1000000     ;LoopCount
           
            invoke  GetCurrentProcess
            invoke  SetPriorityClass, eax, HIGH_PRIORITY_CLASS  ;Priority

            xor     eax, eax        ;; Use same CPUID input value for each call
            cpuid                   ;; Flush pipe & wait for pending ops to finish
            rdtsc                   ;; Read Time Stamp Counter

            push    edx             ;; Preserve high-order 32 bits of start count
            push    eax             ;; Preserve low-order 32 bits of start count
           
            mov     _LoopCounter, 1000000   ;LoopCount
            xor     eax, eax
            cpuid                   ;; Make sure loop setup instructions finish
          ALIGN 16                  ;; Optimal loop alignment for P6
          @@:                       ;; Start an empty reference loop
            sub     _LoopCounter, 1
            jnz     short @B

            xor     eax, eax
            cpuid                   ;; Make sure loop instructions finish
            rdtsc                   ;; Read end count
            pop     ecx             ;; Recover low-order 32 bits of start count
            sub     eax, ecx        ;; Low-order 32 bits of overhead count in EAX
            pop     ecx             ;; Recover high-order 32 bits of start count
            sbb     edx, ecx        ;; High-order 32 bits of overhead count in EDX
            push    edx             ;; Preserve high-order 32 bits of overhead count
            push    eax             ;; Preserve low-order 32 bits of overhead count

            xor     eax, eax
            cpuid
            rdtsc
            push    edx             ;; Preserve high-order 32 bits of start count
            push    eax             ;; Preserve low-order 32 bits of start count
            mov     _LoopCounter, 1000000   ;LoopCount
            xor     eax, eax
            cpuid                   ;; Make sure loop setup instructions finish
ALIGN 16                            ;; Optimal loop alignment for P6
label:                              ;; Start test loop
            START_LOOP_TEST equ <label>
ENDM
; ----------------------------------------------------------------------------------------------
SAVE_COUNTER_CYCLE  MACRO  arg
                    LOCAL  $tmpstr$

        sub     _LoopCounter, 1
        jnz     START_LOOP_TEST

        xor   eax, eax
        cpuid                 ;; Make sure loop instructions finish
        rdtsc                 ;; Read end count
        pop   ecx             ;; Recover low-order 32 bits of start count
        sub   eax, ecx        ;; Low-order 32 bits of test count in EAX
        pop   ecx             ;; Recover high-order 32 bits of start count
        sbb   edx, ecx        ;; High-order 32 bits of test count in EDX
        pop   ecx             ;; Recover low-order 32 bits of overhead count
        sub   eax, ecx        ;; Low-order 32 bits of adjusted count in EAX
        pop   ecx             ;; Recover high-order 32 bits of overhead count
        sbb   edx, ecx        ;; High-order 32 bits of adjusted count in EDX

        mov   DWORD PTR _CounterQword, eax
        mov   DWORD PTR _CounterQword + 4, edx

        invoke GetCurrentProcess
        invoke SetPriorityClass, eax, NORMAL_PRIORITY_CLASS

        finit
        fild  _CounterQword
        fild  _LoopCount
        fdiv
        fistp _CounterQword

        mov     eax, DWORD PTR _CounterQword
        ; ----------------------
        ;      Save time
        ; ----------------------
        call    SaveTiming
       
        print   str$(eax)
;---------------------------------------------------       
        $tmpstr$  CATSTR <chr$(">, <arg>, <")>;,13,10)>       
        print   $tmpstr$, 13,10
ENDM
.code
main proc
LOCAL result[32]:BYTE

mov ecx,num
mov esi,offset _Real10D_00
a0: push ecx
    START_COUNTER_CYCLE_HIGH_PRIORITY_CLASS
lea eax,result
push eax
push esi;offset _Real10_R
call Eprst
    SAVE_COUNTER_CYCLE < cycles, Eprst, _Real10_2 >
print ADDR result,13,10
; inkey " *** STOP - Eprst --- E N D ---*** "
add esi,10
pop ecx
dec ecx
jnz a0
; inkey " *** STOP - Eprst --- E N D ---*** "
exit
   
main endp
;=================================================
SaveTiming  proc
           
            mov     edx, offset _TblTiming0
            mov     ecx, [edx-4]
            mov     [edx+ecx*4], eax
            add     ecx, 1
            mov     [edx-4], ecx                   
            ret

SaveTiming  endp
;================================================
include Eprst.asm
end main

Mikl__

Test_data.inc.data
ALIGN 16
dd 1
_TblTiming0 dd 60 dup (?)
_Real10D_00    dt 0.0
dt -0.0
dd 0FFFFFFFFh,0FFFFFFFFh
dw 7FFEh;max pos normal 1.18973149535723176505e+4932
dd 0,80000000h
dw 1;min pos normal     3.36210314311209350626e-4932
dd 0FFFFFFFFh,7FFFFFFFh
dw 0;max pos subnormal  3.36210314311209350608e-4932
dd 1,0
dw 0;min pos subnormal  3.64519953188247460253e-4951
dd 0,80000000h
dw 7FFFh;+Infinity
dd 0,80000000h
dw 0FFFFh;-Infinity
dd 0FFFFFFFFh,0FFFFFFFFh
dw 7FFFh;quiet NaN with greatest fraction |7fff ffffffff ffffffff| QNaN
dd 0,0C0000000h
dw 7FFFh;quiet NaN with least fraction   |7fff c0000000 00000000| QNaN
dd 0FFFFFFFFh,0BFFFFFFFh
dw 0FFFFh;signaling NaN with greatest fraction |7fff bfffffff ffffffff| SNaN
dd 1,80000000h
dw 0FFFFh;signaling NaN with least fraction    |7fff 80000000 00000001| SNaN
_Real10D_01    dt 0.1
_Real10D_02    dt 0.2
_Real10D_03    dt 0.3
_Real10D_04    dt 0.4
_Real10D_05    dt 0.5
_Real10D_06    dt 0.6
_Real10D_07    dt 0.7
_Real10D_08    dt 0.8
_Real10D_09    dt 0.9

_Real10D_11    dt 1.0
_Real10D_12    dt 2.0
_Real10D_13    dt 3.0
_Real10D_14    dt 4.0
_Real10D_15    dt 5.0
_Real10D_16    dt 6.0
_Real10D_17    dt 7.0
_Real10D_18    dt 8.0
_Real10D_19    dt 9.0

;---------------------------------
_Real10_a11    dt -1.23456789123456
_Real10_a12    dt -12.3456789123456
_Real10_a13    dt -123.456789123456
_Real10_a14    dt -1234.56789123456
_Real10_a15    dt -12345.6789123456
_Real10_a16    dt -123456.789123456
_Real10_a17    dt -1234567.89123456
_Real10_a18    dt -12345678.9123456
_Real10_a19    dt -12345678.9123456
_Real10_a20    dt -123456789.123456
_Real10_a21    dt -1234567891.123456
_Real10_a22    dt -12345678912.123456
_Real10_a23    dt -123456789123.123456
_Real10_a24    dt -1234567891234.123456
_Real10_a25    dt -12345678912345.123456
_Real10_a26    dt -123456789123456.123456
_Real10_a27    dt -1234567891234567.123456
_Real10_a28    dt -12345678912345678.123456
_Real10_a29    dt -123456789123456789.123456

_Real10_111    dt -1.1
_Real10_112    dt -11.1
_Real10_113    dt -111.1
_Real10_114    dt -1111.1
_Real10_115    dt -11111.1
_Real10_116    dt -111111.1
_Real10_117    dt -1111111.1
_Real10_118    dt -11111111.1 ; = 1.0 E+08 = 100 000 000.0
_Real10_119    dt -111111111.1
_Real10_120    dt -1111111111.1
_Real10_121    dt -11111111111.1
_Real10_122    dt -111111111111.1
_Real10_123    dt -1111111111111.1
_Real10_124    dt -11111111111111.1
_Real10_125    dt -111111111111111.1
_Real10_126    dt -1111111111111111.1
_Real10_127    dt -11111111111111111.1
_Real10_128    dt -111111111111111111.1


_Real10_211    dt -2.2
_Real10_212    dt -22.2
_Real10_213    dt -222.2
_Real10_214    dt -2222.2
_Real10_215    dt -22222.2
_Real10_216    dt -222222.2
_Real10_217    dt -2222222.2
_Real10_218    dt -22222222.2 ; = 1.0 E+08 = 100 000 000.0
_Real10_219    dt -222222222.2
_Real10_220    dt -2222222222.2
_Real10_221    dt -22222222222.2
_Real10_222    dt -222222222222.2
_Real10_223    dt -2222222222222.2
_Real10_224    dt -22222222222222.2
_Real10_225    dt -222222222222222.2
_Real10_226    dt -2222222222222222.2
_Real10_227    dt -22222222222222222.2
_Real10_228    dt -222222222222222222.2

_Real10_311    dt -3.3
_Real10_312    dt -33.3
_Real10_313    dt -333.3
_Real10_314    dt -3333.3
_Real10_315    dt -33333.3
_Real10_316    dt -333333.3
_Real10_317    dt -3333333.3
_Real10_318    dt -33333333.3 ; = 1.0 E+08 = 100 000 000.0
_Real10_319    dt -333333333.3
_Real10_320    dt -3333333333.3
_Real10_321    dt -33333333333.3
_Real10_322    dt -333333333333.3
_Real10_323    dt -3333333333333.3
_Real10_324    dt -33333333333333.3
_Real10_325    dt -333333333333333.3
_Real10_326    dt -3333333333333333.3
_Real10_327    dt -33333333333333333.3
_Real10_328    dt -333333333333333333.3

_Real10_411    dt -4.4
_Real10_412    dt -44.4
_Real10_413    dt -444.4
_Real10_414    dt -4444.4
_Real10_415    dt -44444.4
_Real10_416    dt -444444.4
_Real10_417    dt -4444444.4
_Real10_418    dt -44444444.4 ; = 1.0 E+08 = 100 000 000.0
_Real10_419    dt -444444444.4 ; = 1.0 E+08 = 100 000 000.0
_Real10_420    dt -4444444444.4
_Real10_421    dt -44444444444.4
_Real10_422    dt -444444444444.4
_Real10_423    dt -4444444444444.4
_Real10_424    dt -44444444444444.4
_Real10_425    dt -444444444444444.4
_Real10_426    dt -4444444444444444.4
_Real10_427    dt -44444444444444444.4
_Real10_428    dt -444444444444444444.4

_Real10_511    dt -5.5
_Real10_512    dt -55.5
_Real10_513    dt -555.5
_Real10_514    dt -5555.5
_Real10_515    dt -55555.5
_Real10_516    dt -555555.5
_Real10_517    dt -5555555.5
_Real10_518    dt -55555555.5 ; = 1.0 E+08 = 100 000 000.0
_Real10_519    dt -555555555.5
_Real10_520    dt -5555555555.5
_Real10_521    dt -55555555555.5
_Real10_522    dt -555555555555.5
_Real10_523    dt -5555555555555.5
_Real10_524    dt -55555555555555.5
_Real10_525    dt -555555555555555.5
_Real10_526    dt -5555555555555555.5
_Real10_527    dt -55555555555555555.5
_Real10_528    dt -555555555555555555.5

_Real10_611    dt -6.6
_Real10_612    dt -66.6
_Real10_613    dt -666.6
_Real10_614    dt -6666.6
_Real10_615    dt -66666.6
_Real10_616    dt -666666.6
_Real10_617    dt -6666666.6
_Real10_618    dt -66666666.6 ; = 1.0 E+08 = 100 000 000.0
_Real10_619    dt -666666666.6 ; = 1.0 E+08 = 100 000 000.0
_Real10_620    dt -6666666666.6
_Real10_621    dt -66666666666.6
_Real10_622    dt -666666666666.6
_Real10_623    dt -6666666666666.6
_Real10_624    dt -66666666666666.6
_Real10_625    dt -666666666666666.6
_Real10_626    dt -6666666666666666.6
_Real10_627    dt -66666666666666666.6
_Real10_628    dt -666666666666666666.6

_Real10_711    dt -7.7
_Real10_712    dt -77.7
_Real10_713    dt -777.7
_Real10_714    dt -7777.7
_Real10_715    dt -77777.7
_Real10_716    dt -777777.7
_Real10_717    dt -7777777.7
_Real10_718    dt -77777777.7 ; = 1.0 E+08 = 100 000 000.0
_Real10_719    dt -777777777.7
_Real10_720    dt -7777777777.7
_Real10_721    dt -77777777777.7
_Real10_722    dt -777777777777.7
_Real10_723    dt -7777777777777.7
_Real10_724    dt -77777777777777.7
_Real10_725    dt -777777777777777.7
_Real10_726    dt -7777777777777777.7
_Real10_727    dt -77777777777777777.7
_Real10_728    dt -777777777777777777.7

_Real10_811    dt -8.8
_Real10_812    dt -88.8
_Real10_813    dt -888.8
_Real10_814    dt -8888.8
_Real10_815    dt -88888.8
_Real10_816    dt -888888.8
_Real10_817    dt -8888888.8
_Real10_818    dt -88888888.8 ; = 1.0 E+08 = 100 000 000.0
_Real10_819    dt -888888888.8 ; = 1.0 E+08 = 100 000 000.0
_Real10_820    dt -8888888888.8
_Real10_821    dt -88888888888.8
_Real10_822    dt -888888888888.8
_Real10_823    dt -8888888888888.8
_Real10_824    dt -88888888888888.8
_Real10_825    dt -888888888888888.8
_Real10_826    dt -8888888888888888.8
_Real10_827    dt -88888888888888888.8
_Real10_828    dt -888888888888888888.8

_Real10_911    dt -9.9
_Real10_912    dt -99.9
_Real10_913    dt -999.9
_Real10_914    dt -9999.9
_Real10_915    dt -99999.9
_Real10_916    dt -999999.9
_Real10_917    dt -9999999.9
_Real10_918    dt -99999999.9 ; = 1.0 E+08 = 100 000 000.0
_Real10_919    dt -999999999.9 ; = 1.0 E+08 = 100 000 000.0
_Real10_920    dt -9999999999.9
_Real10_921    dt -99999999999.9
_Real10_922    dt -999999999999.9
_Real10_923    dt -9999999999999.9
_Real10_924    dt -99999999999999.9
_Real10_925    dt -999999999999999.9
_Real10_926    dt -9999999999999999.9
_Real10_927    dt -99999999999999999.9
_Real10_928    dt -999999999999999999.9


_Real10_011    dt  0.1
_Real10_012    dt  0.01
_Real10_013    dt  0.001
_Real10_014    dt  0.0001
_Real10_015    dt  0.00001
_Real10_016    dt  0.000001
_Real10_017    dt  0.0000001   ; da = a 16    ; 1.0 E-7
_Real10_018    dt  0.00000001                 ; 1.0 E-8
_Real10_019    dt  0.000000001                ; 1.0 E-9
_Real10_0110   dt  0.0000000001
_Real10_0111   dt  0.00000000001
_Real10_0112   dt  0.000000000001
_Real10_0113   dt  0.0000000000001
_Real10_0114   dt  0.00000000000001
_Real10_0115   dt  0.000000000000001
_Real10_0116   dt  0.0000000000000001
_Real10_0117   dt  0.00000000000000001
_Real10_0118   dt  0.000000000000000001


_Real10_021    dt  0.2
_Real10_022    dt  0.02
_Real10_023    dt  0.002
_Real10_024    dt  0.0002
_Real10_025    dt  0.00002
_Real10_026    dt  0.000002
_Real10_027    dt  0.0000002
_Real10_028    dt  0.00000002
_Real10_029    dt  0.000000002
_Real10_0210   dt  0.0000000002
_Real10_0211   dt  0.00000000002
_Real10_0212   dt  0.000000000002
_Real10_0213   dt  0.0000000000002
_Real10_0214   dt  0.00000000000002
_Real10_0215   dt  0.000000000000002
_Real10_0216   dt  0.0000000000000002
_Real10_0217   dt  0.00000000000000002
_Real10_0218   dt  0.000000000000000002

_Real10_031    dt  0.3
_Real10_032    dt  0.03
_Real10_033    dt  0.003
_Real10_034    dt  0.0003
_Real10_035    dt  0.00003
_Real10_036    dt  0.000003
_Real10_037    dt  0.0000003
_Real10_038    dt  0.00000003
_Real10_039    dt  0.000000003
_Real10_0310   dt  0.0000000003
_Real10_0311   dt  0.00000000003
_Real10_0312   dt  0.000000000003
_Real10_0313   dt  0.0000000000003
_Real10_0314   dt  0.00000000000003
_Real10_0315   dt  0.000000000000003
_Real10_0316   dt  0.0000000000000003
_Real10_0317   dt  0.00000000000000003
_Real10_0318   dt  0.000000000000000003

_Real10_041    dt  0.4
_Real10_042    dt  0.04
_Real10_043    dt  0.004
_Real10_044    dt  0.0004
_Real10_045    dt  0.00004
_Real10_046    dt  0.000004
_Real10_047    dt  0.0000004
_Real10_048    dt  0.00000004
_Real10_049    dt  0.000000004
_Real10_0410   dt  0.0000000004
_Real10_0411   dt  0.00000000004
_Real10_0412   dt  0.000000000004
_Real10_0413   dt  0.0000000000004
_Real10_0414   dt  0.00000000000004
_Real10_0415   dt  0.000000000000004
_Real10_0416   dt  0.0000000000000004
_Real10_0417   dt  0.00000000000000004
_Real10_0418   dt  0.000000000000000004

_Real10_051    dt  0.5
_Real10_052    dt  0.05
_Real10_053    dt  0.005
_Real10_054    dt  0.0005
_Real10_055    dt  0.00005
_Real10_056    dt  0.000005
_Real10_057    dt  0.0000005
_Real10_058    dt  0.00000005
_Real10_059    dt  0.000000005
_Real10_0510   dt  0.0000000005
_Real10_0511   dt  0.00000000005
_Real10_0512   dt  0.000000000005
_Real10_0513   dt  0.0000000000005
_Real10_0514   dt  0.00000000000005
_Real10_0515   dt  0.000000000000005
_Real10_0516   dt  0.0000000000000005
_Real10_0517   dt  0.00000000000000005
_Real10_0518   dt  0.000000000000000005

_Real10_061    dt  0.6
_Real10_062    dt  0.06
_Real10_063    dt  0.006
_Real10_064    dt  0.0006
_Real10_065    dt  0.00006
_Real10_066    dt  0.000006
_Real10_067    dt  0.0000006
_Real10_068    dt  0.00000006
_Real10_069    dt  0.000000006
_Real10_0610   dt  0.0000000006
_Real10_0611   dt  0.00000000006
_Real10_0612   dt  0.000000000006
_Real10_0613   dt  0.0000000000006
_Real10_0614   dt  0.00000000000006
_Real10_0615   dt  0.000000000000006
_Real10_0616   dt  0.0000000000000006
_Real10_0617   dt  0.00000000000000006
_Real10_0618   dt  0.000000000000000006

_Real10_071    dt  0.7
_Real10_072    dt  0.07
_Real10_073    dt  0.007
_Real10_074    dt  0.0007
_Real10_075    dt  0.00007
_Real10_076    dt  0.000007
_Real10_077    dt  0.0000007
_Real10_078    dt  0.00000007
_Real10_079    dt  0.000000007
_Real10_0710   dt  0.0000000007
_Real10_0711   dt  0.00000000007
_Real10_0712   dt  0.000000000007
_Real10_0713   dt  0.0000000000007
_Real10_0714   dt  0.00000000000007
_Real10_0715   dt  0.000000000000007
_Real10_0716   dt  0.0000000000000007
_Real10_0717   dt  0.00000000000000007
_Real10_0718   dt  0.000000000000000007

_Real10_081    dt  0.8
_Real10_082    dt  0.08
_Real10_083    dt  0.008
_Real10_084    dt  0.0008
_Real10_085    dt  0.00008
_Real10_086    dt  0.000008
_Real10_087    dt  0.0000008
_Real10_088    dt  0.00000008
_Real10_089    dt  0.000000008
_Real10_0810   dt  0.0000000008
_Real10_0811   dt  0.00000000008
_Real10_0812   dt  0.000000000008
_Real10_0813   dt  0.0000000000008
_Real10_0814   dt  0.00000000000008
_Real10_0815   dt  0.000000000000008
_Real10_0816   dt  0.0000000000000008
_Real10_0817   dt  0.00000000000000008
_Real10_0818   dt  0.000000000000000008

_Real10_091    dt  0.9
_Real10_092    dt  0.09
_Real10_093    dt  0.009
_Real10_094    dt  0.0009
_Real10_095    dt  0.00009
_Real10_096    dt  0.000009
_Real10_097    dt  0.0000009
_Real10_098    dt  0.00000009
_Real10_099    dt  0.000000009
_Real10_0910   dt  0.0000000009
_Real10_0911   dt  0.00000000009
_Real10_0912   dt  0.000000000009
_Real10_0913   dt  0.0000000000009
_Real10_0914   dt  0.00000000000009
_Real10_0915   dt  0.000000000000009
_Real10_0916   dt  0.0000000000000009
_Real10_0917   dt  0.00000000000000009
_Real10_0918   dt  0.000000000000000009
;-----------------------------------------
_Real10e60     dt 1.2345e+60
_Real10e61     dt 1.2345e+61
_Real10e62     dt 1.2345e+62
_Real10e63     dt 1.2345e+63

_Real10e_60    dt 1.2345e-60
_Real10e_61    dt 1.2345e-61
_Real10e_62    dt 1.2345e-62
_Real10e_63    dt 1.2345e-63

_Real10e70     dt 1.2345e+70
_Real10e71     dt 1.2345e+71
_Real10e72     dt 1.2345e+72
_Real10e73     dt 1.2345e+73

_Real10e_50    dt 1.2345e-50
_Real10e_51    dt 1.2345e-51
_Real10e_52    dt 1.2345e-52
_Real10e_53    dt 1.2345e-53
num = ($ - _Real10D_00)/10
Por favor verifique esta.
Muito obrigado!

RuiLoureiro

Hi Mikl,
These are the results from Eprst
(You need to do some more work)

3,141592653589793238E+0000
*** STOP - Eprst- PI ***
1 --- 0000_0000_0000_0000_0000 = +0.0
2 --- 0000_0000_0000_0000_0001 =  3,645199531882474602E-4951
3 --- 0000_7FFF_FFFF_FFFF_FFFF =  3,362103143112093506E-4932
4 --- 0000_8000_0000_0000_0000 = Error
5 --- 0000_8000_0000_0000_0001 = Error
6 --- 0000_FFFF_FFFF_FFFF_FFFF = Error
7 --- 0001_0000_0000_0000_0000 -INVALID = Error
8 --- 0001_0000_0000_0000_0001 -INVALID = Error
9 --- 0001_7FFF_FFFF_FFFF_FFFF -INVALID = Error
10 --- 0001_8000_0000_0000_0000 =  3,362103143112092086E-4932
11 --- 0001_8000_0000_0000_0001 = Error
12 --- 0001_FFFF_FFFF_FFFF_FFFF =  6,724206286224184172E-4932
13 --- 0002_0000_0000_0000_0000 -INVALID = Error
14 --- 0002_0000_0000_0000_0001 -INVALID = Error
15 --- 0002_7FFF_FFFF_FFFF_FFFF -INVALID = Error
16 --- 0002_8000_0000_0000_0000 =  6,724206286224184173E-4932
17 --- 0002_8000_0000_0000_0001 = Error
18 --- 0002_FFFF_FFFF_FFFF_FFFF =  1,344841257244836834E-4931
19 --- 7FFE_0000_0000_0000_0000 -INVALID = Error
20 --- 7FFE_0000_0000_0000_0001 -INVALID = Error
21 --- 7FFE_7FFF_FFFF_FFFF_FFFF -INVALID = Error
22 --- 7FFE_8000_0000_0000_0000 =  5,948657476786158822E+4931
23 --- 7FFE_8000_0000_0000_0001 = Error
24 --- 7FFE_FFFF_FFFF_FFFF_FFFF -LimitReal10 =  1,189731495357231764E+4932
25 --- 7FFF_0000_0000_0000_0000 -NAN = Error
26 --- 7FFF_0000_0000_0000_0001 -NAN = Error
27 --- 7FFF_7FFF_FFFF_FFFF_FFFF -NAN = Error
28 --- 7FFF_8000_0000_0000_0000 +INFINITY = +Infinity
29 --- 7FFF_8000_0000_0000_0001 -NAN = +Signal Non a Number
30 --- 7FFF_BFFF_FFFF_FFFF_FFFF -NAN = +Signal Non a Number
31 --- 7FFF_C000_0000_0000_0000 -NAN = +Quiet Non a Number
32 --- 7FFF_C000_0000_0000_0001 -NAN = Error
33 --- 7FFF_FFFF_FFFF_FFFF_FFFF -NAN = +Quiet Non a Number
34 --- 8000_0000_0000_0000_0000 = -0.0
35 --- 8000_0000_0000_0000_0001 = -3,645199531882474602E-4951
36 --- 8000_7FFF_FFFF_FFFF_FFFF = -3,362103143112093506E-4932
37 --- 8000_8000_0000_0000_0000 = Error
38 --- 8000_8000_0000_0000_0001 = Error
39 --- 8000_FFFF_FFFF_FFFF_FFFF = Error
40 --- 8001_0000_0000_0000_0000 -INVALID = Error
41 --- 8001_0000_0000_0000_0001 -INVALID = Error
42 --- 8001_7FFF_FFFF_FFFF_FFFF -INVALID = Error
43 --- 8001_8000_0000_0000_0000 = -3,362103143112092086E-4932
44 --- 8001_8000_0000_0000_0001 = Error
45 --- 8001_FFFF_FFFF_FFFF_FFFF = -6,724206286224184172E-4932
46 --- 8002_0000_0000_0000_0000 -INVALID = Error
47 --- 8002_0000_0000_0000_0001 -INVALID = Error
48 --- 8002_7FFF_FFFF_FFFF_FFFF -INVALID = Error
49 --- 8002_8000_0000_0000_0000 = Error
50 --- 8002_8000_0000_0000_0001 = Error
51 --- 8002_FFFF_FFFF_FFFF_FFFF = -1,344841257244836834E-4931
52 --- FFFE_0000_0000_0000_0000 -INVALID = Error
53 --- FFFE_0000_0000_0000_0001 -INVALID = Error
54 --- FFFE_7FFF_FFFF_FFFF_FFFF -INVALID = Error
55 --- FFFE_8000_0000_0000_0000 = -5,948657476786158822E+4931
56 --- FFFE_8000_0000_0000_0001 = Error
57 --- FFFE_FFFF_FFFF_FFFF_FFFF -LimitReal10 = -1,189731495357231764E+4932
58 --- FFFF_0000_0000_0000_0000 -NAN = Error
59 --- FFFF_0000_0000_0000_0001 -NAN = Error
60 --- FFFF_7FFF_FFFF_FFFF_FFFF -NAN = Error
61 --- FFFF_8000_0000_0000_0000 -INFINITY = -Infinity
62 --- FFFF_8000_0000_0000_0001 -NAN = -Signal Non a Number
63 --- FFFF_BFFF_FFFF_FFFF_FFFF -NAN = -Signal Non a Number
64 --- FFFF_C000_0000_0000_0000 -NAN = -Quiet Non a Number
65 --- FFFF_C000_0000_0000_0001 -NAN = Error
66 --- FFFF_FFFF_FFFF_FFFF_FFFF -NAN = -Quiet Non a Number
*** END test data 1 - Eprst- ***


These are the results i got

3.141592653589793238
*** STOP - ConvertReal10KX- PI ***
1 --- 0000_0000_0000_0000_0000 =  0
2 --- 0000_0000_0000_0000_0001 =  3.645199531882474602e-4951
3 --- 0000_7FFF_FFFF_FFFF_FFFF =  3.362103143112093506e-4932
4 --- 0000_8000_0000_0000_0000 =  3.362103143112093506e-4932
5 --- 0000_8000_0000_0000_0001 =  3.362103143112093506e-4932
6 --- 0000_FFFF_FFFF_FFFF_FFFF =  6.724206286224187012e-4932
7 --- 0001_0000_0000_0000_0000 -INVALID = ERROR
8 --- 0001_0000_0000_0000_0001 -INVALID = ERROR
9 --- 0001_7FFF_FFFF_FFFF_FFFF -INVALID = ERROR
10 --- 0001_8000_0000_0000_0000 =  3.362103143112092086e-4932
11 --- 0001_8000_0000_0000_0001 =  3.362103143112092087e-4932
12 --- 0001_FFFF_FFFF_FFFF_FFFF =  6.724206286224184172e-4932
13 --- 0002_0000_0000_0000_0000 -INVALID = ERROR
14 --- 0002_0000_0000_0000_0001 -INVALID = ERROR
15 --- 0002_7FFF_FFFF_FFFF_FFFF -INVALID = ERROR
16 --- 0002_8000_0000_0000_0000 =  6.724206286224184173e-4932
17 --- 0002_8000_0000_0000_0001 =  6.724206286224184174e-4932
18 --- 0002_FFFF_FFFF_FFFF_FFFF =  1.344841257244836834e-4931
19 --- 7FFE_0000_0000_0000_0000 -INVALID = ERROR
20 --- 7FFE_0000_0000_0000_0001 -INVALID = ERROR
21 --- 7FFE_7FFF_FFFF_FFFF_FFFF -INVALID = ERROR
22 --- 7FFE_8000_0000_0000_0000 =  5.948657476786158822e+4931
23 --- 7FFE_8000_0000_0000_0001 =  5.948657476786158822e+4931
24 --- 7FFE_FFFF_FFFF_FFFF_FFFF -LimitReal10 =  1.189731495357231764e+4932
25 --- 7FFF_0000_0000_0000_0000 -NAN = ERROR
26 --- 7FFF_0000_0000_0000_0001 -NAN = ERROR
27 --- 7FFF_7FFF_FFFF_FFFF_FFFF -NAN = ERROR
28 --- 7FFF_8000_0000_0000_0000 +INFINITY =  INFINITY
29 --- 7FFF_8000_0000_0000_0001 -NAN = ERROR
30 --- 7FFF_BFFF_FFFF_FFFF_FFFF -NAN = ERROR
31 --- 7FFF_C000_0000_0000_0000 -NAN = ERROR
32 --- 7FFF_C000_0000_0000_0001 -NAN = ERROR
33 --- 7FFF_FFFF_FFFF_FFFF_FFFF -NAN = ERROR
34 --- 8000_0000_0000_0000_0000 =  0
35 --- 8000_0000_0000_0000_0001 = -3.645199531882474602e-4951
36 --- 8000_7FFF_FFFF_FFFF_FFFF = -3.362103143112093506e-4932
37 --- 8000_8000_0000_0000_0000 = -3.362103143112093506e-4932
38 --- 8000_8000_0000_0000_0001 = -3.362103143112093506e-4932
39 --- 8000_FFFF_FFFF_FFFF_FFFF = -6.724206286224187012e-4932
40 --- 8001_0000_0000_0000_0000 -INVALID = ERROR
41 --- 8001_0000_0000_0000_0001 -INVALID = ERROR
42 --- 8001_7FFF_FFFF_FFFF_FFFF -INVALID = ERROR
43 --- 8001_8000_0000_0000_0000 = -3.362103143112092086e-4932
44 --- 8001_8000_0000_0000_0001 = -3.362103143112092087e-4932
45 --- 8001_FFFF_FFFF_FFFF_FFFF = -6.724206286224184172e-4932
46 --- 8002_0000_0000_0000_0000 -INVALID = ERROR
47 --- 8002_0000_0000_0000_0001 -INVALID = ERROR
48 --- 8002_7FFF_FFFF_FFFF_FFFF -INVALID = ERROR
49 --- 8002_8000_0000_0000_0000 = -3.362103143112093506e-4932
50 --- 8002_8000_0000_0000_0001 = -3.362103143112093506e-4932
51 --- 8002_FFFF_FFFF_FFFF_FFFF = -1.344841257244836834e-4931
52 --- FFFE_0000_0000_0000_0000 -INVALID = ERROR
53 --- FFFE_0000_0000_0000_0001 -INVALID = ERROR
54 --- FFFE_7FFF_FFFF_FFFF_FFFF -INVALID = ERROR
55 --- FFFE_8000_0000_0000_0000 = -5.948657476786158822e+4931
56 --- FFFE_8000_0000_0000_0001 = -5.948657476786158822e+4931
57 --- FFFE_FFFF_FFFF_FFFF_FFFF -LimitReal10 = -1.189731495357231764e+4932
58 --- FFFF_0000_0000_0000_0000 -NAN = ERROR
59 --- FFFF_0000_0000_0000_0001 -NAN = ERROR
60 --- FFFF_7FFF_FFFF_FFFF_FFFF -NAN = ERROR
61 --- FFFF_8000_0000_0000_0000 -INFINITY = -INFINITY
62 --- FFFF_8000_0000_0000_0001 -NAN = ERROR
63 --- FFFF_BFFF_FFFF_FFFF_FFFF -NAN = ERROR
64 --- FFFF_C000_0000_0000_0000 -NAN = ERROR
65 --- FFFF_C000_0000_0000_0001 -NAN = ERROR
66 --- FFFF_FFFF_FFFF_FFFF_FFFF -NAN = ERROR
*** END test data 1 - ConvertReal10KX- **


Now, the number of cycles converting PI - 19 digits

3,141592653589793238E+0000
3.141592653589793238
*** STOP - Eprst+ConvertReal10KX- PI ***
577 cycles, Eprst, _Real10_PI

343 cycles, ConvertReal10KX, _Real10_PI

576 cycles, Eprst, _Real10_PI

352 cycles, ConvertReal10KX, _Real10_PI


***** Time table *****

Intel(R) Pentium(R) 4 CPU 3.40GHz (SSE3)

343  cycles, ConvertReal10KX -19 digits
352  cycles, ConvertReal10KX -19 digits
576  cycles, Eprst -19 digits
577  cycles, Eprst -19 digits
*** END converting PI - Eprst + ConvertReal10KX- **


RuiLoureiro

In the folder Mikl_3 we have:

. all about Mikl new files

. TestMikl_new

. ConvertKX.inc where we have the procedure ConvertReal10KX
  to one we want to use ConvertReal10KX to convert a real10
  to string
 
. TestData.inc

. TestConvertKX

. TestTiming ( please show us your results  ;))

note: i wrote ConvertReal10KX based on the work of Mikl  :t