The MASM Forum

General => The Campus => Topic started by: RuiLoureiro on April 28, 2013, 05:26:33 AM

Title: Converting a Real10 to string
Post by: RuiLoureiro on April 28, 2013, 05:26:33 AM
Hi
   
    ConvertFloat10DS is a procedure that converts a real10
   - integer digits (up to 19)- to a qword integer and
    then to a string. It doesnt use BCD and we may
    understand it in 4/5 simple steps.  ;)

    We can get the complete file ConverterQQ.inc
    inside the folder ConverterQQ.

EDIT: please add this:
                       $TRUNCATE$     equ 027fh


Quote
; Input:
;           pReal10 = pointer                                       dd 0    <------- for lenght
;           pRcl   --------------> buffer shoud be  _buffer db x dup (?), 0
;
ConvertFloat10DS    proc     pReal10:DWORD, pRcl:DWORD
                    LOCAL    expscale     :DWORD
                    LOCAL    expscaleM    :DWORD
                    LOCAL    expscaleS    :DWORD
                    LOCAL    exponent     :DWORD
                    LOCAL    QWinteger    :QWORD
                    LOCAL    oldcw        :WORD
                    LOCAL    truncw       :WORD
                    LOCAL    string[20]   :BYTE
                    LOCAL    Real10Buf[10]:BYTE
                                       
                    push     ebx
                    push     esi
                    push     edi                   
                   
                    mov      edi, pRcl     
                    mov      ebx, pReal10

                    ; --------------------------
                    ;          examine
                    ; --------------------------
                    fld      tbyte ptr [ebx]
                    fxam
                    fstsw    ax               
                    fwait
                    sahf
                    jz       short @F
                    jpo      _erro1          ;C3=0 and C2=0 would be NAN or unsupported
                    jnc      short _start

                    ;-------------
                    ; is  INFINITY
                    ;-------------                   
                    mov      al,"+"
                    test     ah, 2             ;C1 field = sign
                    jz       _isinfinity
                    mov      al,"-"
                    jnz      _isinfinity
                                     
                    ;--------------------------
                    ; may be 0  or Denormalized
                    ;--------------------------
            @@:     jpe      short _isDenormal      ; comment this and
                    jmp      _iszero                           ; jpo     _iszero
                   
                    ; ---------------
                    ; Is demormalized
                    ; ---------------
    _isDenormal:    lea      ebx, Real10Buf
                    fstp     tbyte ptr [ebx]
                    or       word ptr [ebx+8], 1
                    fld      tbyte ptr [ebx]                   
                                                                                     
                    ;--------------------------------------
                    ;           get the exponent
                    ; exponent = characteristic of log10(X)
                    ;--------------------------------------
        _start:     fldlg2                  ; st(0)=log10(2) ; st(1)=X
                    fld      st(1)          ; copy st(1)=X to st(0)
                    fabs                    ; positive value
                    fyl2x                   ; log10(2)*log2(X) = log10(X)

                    ; ---------------------------------
                    ; X          in st(2) st(1)
                    ; log10(2)   in st(1) removed fyl2x
                    ; |X|        in st(0) removed fyl2x
                    ; log10(|X|) in st(0) st(0)   
                    ; ---------------------------------                                           

                    ; -----------------------------------------------------------
                    ;       Convert the logarithm to a truncated integer
                    ;  store the truncating value of the logarithm to exponent
                    ; -----------------------------------------------------------     
                    SETTRUNCATE oldcw, truncw
                    fistp    exponent
                    fldcw    oldcw          ; load back the former control word

                    ; -----------------------------
                    ; Get exponent scale factor
                    ; -----------------------------
                    mov     eax, $EXPONENT_REAL10_MAX
                    mov     edx, $DECIMALPLACES_REAL10
                    sub     edx, exponent
                    mov     expscale, edx
                    mov     expscaleM, edx
           
                    mov     ebx, offset _PowerTblQQP38
       
                    or      edx, edx
                    jns     short _cmpexpscale

                    neg     edx
                    mov     ebx, offset _PowerTblQQM38
           
                    cmp     edx, 46
                    jbe     short _load0

                    ; ------------------------------------------------
                    ; compute 10^expscale= 10^expscaleM * 10^expscaleS
                    ;    (where expscale= expscaleM + expscaleS)
                    ;     if expscale > $EXPONENT_REAL10_MAX 
                    ;   because 10^$EXPONENT_REAL10_MAX+2= INFINITY
                    ; ------------------------------------------------
    _power10:       cmp     edx, eax
                    jbe     short @F
                    ;
                    mov     expscaleM,  eax
                    sub     edx, eax
                    mov     expscaleS, edx                   

                    ; -----------------------------------
                    ;        compute 10^expscaleS
                    ; -----------------------------------                   
                    fild    expscaleS
                    fldl2t             ; log2(10)
                    fmul               ; log2(10)*expscale
                    fld     st
                    frndint            ; get the characteristic
                    fxch
                    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
                    ;
                    fmul               ; X * 10^expscaleS

                    ; -----------------------------------
                    ;        compute 10^expscaleM
                    ; -----------------------------------
            @@:     fild    expscaleM
                    fldl2t             ; log2(10)
                    fmul               ; log2(10)*expscale
                    fld     st
                    frndint            ; get the characteristic
                    fxch
                    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

    _cmpexpscale:   cmp     edx, 46
                    ja      short _power10
           
        _load0:     shl     edx, 4
                    fld     tbyte ptr [ebx+edx]                   
                   
                    ; -------------------------                   
                    ; Multiply X by 10^expscale
                    ; -------------------------
    _multiply:      fmul

                    ; -----------------
                    ; store the integer
                    ; -----------------
                    fistp   QWinteger
                    fstsw   ax
                    fwait
                    shr     ax,1              ;test for invalid operation
                    jc      _erro2 

                    ; ---------------------------
                    ; convert QWinteger to string
                    ; ---------------------------
                    lea     esi, QWinteger
                    mov     eax, dword ptr [esi+0]
                    mov     edx, dword ptr [esi+4]

                    mov     bl, ' '
                    or      edx, edx
                    jns     short @F
                   
                    neg     eax
                    neg     edx
                    sub     edx, 1
                    ;
                    mov     bl, '-'
                    ; ------------------------
                    ;     Set the sign
                    ; ------------------------
            @@:     mov     byte ptr [edi], bl
                    add     edi, 1
                   
                    lea     esi, string+20

                    CONVERT1EDXEAX
                   
                    mov     edx, $DECIMALPLACES_REAL10
                   
                    ; -----------------------------------
                    ;     Recalculate exponent based
                    ; in the number of integer digits ebx
                    ; -----------------------------------
                    mov     eax, ebx
                    sub     eax, expscale
                    sub     eax, 1
                    mov     exponent, eax         ; we need only eax not exponent var
                   
                    ; --------------------------------------------------------
                    ; Regular notation or scientific notation ?
                    ; ebx = total number of digits in the buffer
                    ; edx = number of decimal places
                    ; eax = exponent
                    ; --------------------------------------------------------
               
                    or      eax, eax
                    jns     short _ispositive       ; exponent is positive

                    mov     ecx, eax
                    neg     ecx

                    ;cmp     ecx, 5 
                    cmp     ecx, edx
                    ja      _isscientific

                    ; ------------------------------
                    ; Regular notation - decimal
                    ; ------------------------------
                    mov     word ptr [edi], '.0'
                    add     edi, 2
                   
                    ; ------------------------------
                    ; If exponent = -1 it is 0.ddddd
                    ; If exponent = -2 it is 0.0dddd
                    ;         and so on
                    ; ------------------------------
                    sub     ecx, 1
                    jz      _movedecimal
                   
                    sub     edx, ecx
                   
                    ; -------------------------
                    ;        insert 0
                    ; -------------------------
            @@:     mov     byte ptr [edi], '0'
                    add     edi, 1
                    sub     ecx, 1
                    jnz     short @B

    _movedecimal:   movzx   eax, byte ptr [esi]
                    mov     byte ptr [edi], al
                    add     edi, 1
                    add     esi, 1

                    sub     edx, 1
                    jnz     short _movedecimal
                    jz      short _removeD
                    ; ------------------
                    ; remove last zeroes
                    ; ------------------
            @@:     sub     edi, 1
        _removeD:   movzx   eax, word ptr [edi-2]
                    cmp     al, '.'
                    je      _finish
                    ;
                    cmp     ah, '0'
                    je      short @B
                    jmp     _finish

            ;--------------------------------------------------
            ; ebx = total number of digits
            ; edx = number of decimal places
            ; eax = exponent
            ;--------------------------------------------------
                    ; -------------------
                    ;   exponent >= 0
                    ; -------------------
    _ispositive:    cmp     eax, edx
                    jae     _isscientific
                                   
                    ; ----------------------------------
                    ; Regular notation - integer
                    ; ----------------------------------
                    add     eax, 1              ; number of integer digits
                    sub     ebx, eax            ; number of decimal digits
                    ;
            @@:     movzx   edx, byte ptr [esi]
                    mov     byte ptr [edi], dl
                    add     edi, 1
                    add     esi, 1                   

                    sub     eax, 1
                    jnz     short @B
                    ;
                    or      ebx, ebx
                    jz      _finish
                   
                    mov     byte ptr [edi], '.'
                    add     edi, 1
                    ;
            @@:     movzx   eax, byte ptr [esi]
                    mov     byte ptr [edi], al
                    add     edi, 1
                    add     esi, 1                   

                    sub     ebx, 1
                    jnz     short @B
                    jmp     short _removeI
                    ; ------------------
                    ; remove last zeroes
                    ; ------------------
            @@:     sub     edi, 1
        _removeI:   movzx   eax, word ptr [edi-2]
                    cmp     al, '.'
                    je      _finish
                    ;
                    cmp     ah, '0'
                    je      short @B
                    jmp     _finish
                                       
            ;--------------------------------------------------
            ;                 is Scientific
            ;--------------------------------------------------
    _isscientific:  sub     ebx, 1
                   
                    movzx   edx, byte ptr [esi]
                    mov     dh, '.'                   
                    add     esi, 1
                    ;
                    mov     word ptr [edi], dx
                    add     edi, 2
                   
            @@:     movzx   edx, byte ptr [esi]
                    mov     byte ptr [edi], dl
                    ;
                    add     edi, 1
                    add     esi, 1

                    sub     ebx, 1
                    jnz     short @B
                    jz      short _removeE
                   
                    ; ------------------------
                    ; remove last zeroes
                    ; ------------------------
            @@:     sub     edi, 1
        _removeE:   movzx   edx, word ptr [edi-2]
                    cmp     dl, '.'
                    je      short @F
                    ;
                    cmp     dh, '0'
                    je      short @B

            @@:     EXPONENTREAL_10W
                           
        _finish:    mov      eax, edi
                    mov      edi, pRcl
                    sub      eax, edi

        _exit0:     mov      dword ptr [edi-4], eax
                    mov      byte ptr [edi+eax], 0
                                             
                    xor      eax, eax
                    clc
        _exit:      pop      edi
                    pop      esi
                    pop      ebx
                    ret
;------------------------------------------------------------
;                      fxam, ebp
;------------------------------------------------------------
    _iszero:        fstp     st(0)                                     
                    mov      word ptr [edi], '0 '   ;3020h
                    mov      eax, 2
                    jmp      _exit0
           
    _isinfinity:    fstp     st(0)
                    mov      byte ptr [edi], al
                    mov      dword ptr [edi+1], "IFNI"
                    mov      dword ptr [edi+5], "YTIN"
                    ;
                    mov      eax, 9
                    jmp      _exit0
                   
                    ; --------------------
                    ; is indefinite or NAN
                    ; --------------------
        _erro1:     fstp     st(0)
                    mov      eax, 1
                    ;
        _error:     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
                                       
                    ; -----------------
                    ; invalid operation
                    ; -----------------
        _erro2:     fclex
                    mov      eax, 2
                    stc
                    jmp      _error
ConvertFloat10DS    endp
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

Some results

0000_80000000_00000000 = 3.3621031431120935E-4932
0000_FFFFFFFF_FFFFFFFF = 6.724206286224187E-4932
0000_00000000_00000001 =ERROR
0000_FFFFFFFF_FFFFFFFF =ERROR
7FFF_80000000_00000000 =+INFINITY
FFFF_80000000_00000000 =-INFINITY
7FFE_FFFFFFFF_FFFFFFFF = 1.18973149535723177E+4932
FFFE_FFFFFFFF_FFFFFFFF =-1.18973149535723177E+4932
*** STOP - ConvertFloat10DS  end test digits ***
0
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
*** STOP - ConvertFloat10DS ***
0.8
0.08
0.008
0.0008
0.00008
0.000008
0.0000008
0.00000008
0.000000008
0.0000000008
0.00000000008
0.000000000008
0.0000000000008
0.00000000000008
0.000000000000008
0.0000000000000008
0.00000000000000008
8.0E-18
*** STOP - ConvertFloat10DS ***
0.9
0.09
0.009
0.0009
0.00009
0.000009
0.0000009
0.00000009
0.000000009
0.0000000009
0.00000000009
0.000000000009
0.0000000000009
0.00000000000009
0.000000000000009
0.0000000000000009
0.00000000000000009
9.0E-18
*** STOP - ConvertFloat10DS ***
-1.23456789123456
-12.3456789123456
-123.456789123456
-1234.56789123456
-12345.6789123456
-123456.789123456
-1234567.89123456
-12345678.9123456
-12345678.9123456
-123456789.123456
-1234567891.123456
-12345678912.123456
-123456789123.123456
-1234567891234.12346
-12345678912345.1235
-123456789123456.123
-1234567891234567.12
-12345678912345678.1
-1.23456789123456789E+17
*** STOP - ConvertFloat10DS --- E N D ---**
Title: Re: Converting a Real10 to string
Post by: jj2007 on April 28, 2013, 11:14:44 AM
ConverterQQ.inc(424) : error A2006: undefined symbol : $TRUNCATE$  ::)
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on April 28, 2013, 07:49:55 PM
Quote from: jj2007 on April 28, 2013, 11:14:44 AM
ConverterQQ.inc(424) : error A2006: undefined symbol : $TRUNCATE$  ::)
Thanks Jochen,

$TRUNCATE$     equ 027fh
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 11, 2013, 09:18:24 AM
My last tests about real10 to string (47 procedures)
conclusion: BCD are better

For 10 digits:
Quote
***** Time table *****

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

341  cycles, ConvertFloat10DX, direct, fxam, fxtract, esp - 10 digits
341  cycles, ConvertFloat10DY, direct, examine, fxtract, esp - 10 digits
347  cycles, ConvertReal10DX, direct, fxam, fxtract, esp - 10 digits
356  cycles, ConvertReal10DY, direct, examine, fxtract, esp - 10 digits
356  cycles, ConvertReal10DR, direct, examine, fxtract, ebp - 10 digits
356  cycles, ConvertFloat10DR, direct, examine, fxtract, ebp - 10 digits
365  cycles, ConvertFloat10DRD, direct, examine, fxtract, ebp - 10 digits
365  cycles, ConvertReal10DRD, direct, examine, fxtract, ebp - 10 digits
411  cycles, ConvertFloat10DYD, direct, examine, fxtract, esp - 10 digits
414  cycles, ConvertFloat10DXD, direct, fxam, fxtract, esp - 10 digits
418  cycles, ConvertReal10DYD, direct, examine, fxtract, esp - 10 digits
423  cycles, ConvertReal10DXD, direct, fxam, fxtract, esp - 10 digits
475  cycles, ConvertFloat10DF, direct, examine, fyl2x, ebp - 10 digits
478  cycles, ConvertFloat10DS, direct, fxam, fyl2x, ebp - 10 digits
479  cycles, ConvertReal10DF, direct, examine, fyl2x, ebp - 10 digits
486  cycles, ConvertReal10DSD, direct, fxam, fyl2x, ebp - 10 digits
487  cycles, ConvertFloat10DFD, direct, examine, fyl2x, ebp - 10 digits
487  cycles, ConvertFloat10DSD, direct, fxam, fyl2x, ebp - 10 digits
489  cycles, ConvertReal10DS, direct, fxam, fyl2x, ebp - 10 digits
492  cycles, ConvertReal10DFD, direct, examine, fyl2x, ebp - 10 digits
716  cycles, ConvertFloat10CT, BCD-CT, fxam, fxtract, esp - 10 digits
724  cycles, ConvertFloat10BX, BCD, fxam, fxtract, ebp - 10 digits
729  cycles, ConvertReal10CTD, BCD-CT, fxam, fxtract, esp - 10 digits
731  cycles, ConvertReal10BX, BCD, fxam, fxtract, ebp - 10 digits
739  cycles, ConvertFloat10BY, BCD, examine, fxtract, esp - 10 digits
739  cycles, ConvertFloat10CTD, BCD-CT, fxam, fxtract, esp - 10 digits
742  cycles, ConvertReal10BFD, BCD, fxam, fxtract, esp - 10 digits
744  cycles, ConvertFloat10BF, BCD, fxam, fxtract, esp - 10 digits
744  cycles, ConvertReal10BYD, BCD, examine, fxtract, esp - 10 digits
745  cycles, ConvertFloat10BFD, BCD, fxam, fxtract, esp - 10 digits
745  cycles, ConvertFloat10BYD, BCD, examine, fxtract, esp - 10 digits
746  cycles, ConvertReal10BY, BCD, examine, fxtract, esp - 10 digits
749  cycles, ConvertReal10BXD, BCD, fxam, fxtract, ebp - 10 digits
750  cycles, ConvertFloat10BXD, BCD, fxam, fxtract, ebp - 10 digits
752  cycles, ConvertReal10BF, BCD, fxam, fxtract, esp - 10 digits
775  cycles, ConvertReal10CT, BCD-CT, fxam, fxtract, esp - 10 digits
1147  cycles, ConvertFloat10ZX, BCD - old - 10 digits
1154  cycles, ConvertFloat10Z, BCD -old - 10 digits
2704  cycles, ConvertFloat10DWD, direct,Save FPU, fxam, fxtract, esp -10 digits
2709  cycles, ConvertReal10DWD, direct,Save FPU, fxam, fxtract, esp -10 digits
2798  cycles, ConvertFloat10DW, direct,Save FPU, fxam, fxtract, esp -10 digits
2816  cycles, ConvertReal10DW, direct,Save FPU, fxam, fxtract, esp -10 digits
2989  cycles, ConvertFloat10BW, BCD, Save FPU, fxam, fxtract, ebp - 10 digits
2995  cycles, ConvertReal10BW, BCD, Save FPU, fxam, fxtract, ebp - 10 digits
3042  cycles, ConvertFloat10, BCD, Save FPU -old - 10 digits
3104  cycles, ConvertFloat10BWD, BCD, Save FPU, fxam, fxtract, ebp - 10 digits
3126  cycles, ConvertReal10BWD, BCD, Save FPU, fxam, fxtract, ebp - 10 digits
********** END **********


For 15 digits:
Quote
***** Time table *****

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

756  cycles, ConvertFloat10BX, BCD, fxam, fxtract, ebp - 15 digits
769  cycles, ConvertFloat10BFD, BCD, fxam, fxtract, esp - 15 digits
769  cycles, ConvertReal10BYD, BCD, examine, fxtract, esp - 15 digits
770  cycles, ConvertReal10BFD, BCD, fxam, fxtract, esp - 15 digits
770  cycles, ConvertFloat10BYD, BCD, examine, fxtract, esp - 15 digits
771  cycles, ConvertReal10BY, BCD, examine, fxtract, esp - 15 digits
772  cycles, ConvertFloat10BF, BCD, fxam, fxtract, esp - 15 digits
776  cycles, ConvertFloat10CT, BCD-CT, fxam, fxtract, esp - 15 digits
778  cycles, ConvertFloat10BY, BCD, examine, fxtract, esp - 15 digits
779  cycles, ConvertReal10BXD, BCD, fxam, fxtract, ebp - 15 digits
779  cycles, ConvertFloat10BXD, BCD, fxam, fxtract, ebp - 15 digits
791  cycles, ConvertReal10CTD, BCD-CT, fxam, fxtract, esp - 15 digits
797  cycles, ConvertFloat10CTD, BCD-CT, fxam, fxtract, esp - 15 digits
800  cycles, ConvertReal10CT, BCD-CT, fxam, fxtract, esp - 15 digits
801  cycles, ConvertReal10BX, BCD, fxam, fxtract, ebp - 15 digits
802  cycles, ConvertReal10BF, BCD, fxam, fxtract, esp - 15 digits
1024  cycles, ConvertFloat10DR, direct, examine, fxtract, ebp - 15 digits
1029  cycles, ConvertFloat10DRD, direct, examine, fxtract, ebp - 15 digits
1032  cycles, ConvertReal10DR, direct, examine, fxtract, ebp - 15 digits
1035  cycles, ConvertReal10DRD, direct, examine, fxtract, ebp - 15 digits
1041  cycles, ConvertReal10DX, direct, fxam, fxtract, esp - 15 digits
1042  cycles, ConvertFloat10DX, direct, fxam, fxtract, esp - 15 digits
1046  cycles, ConvertFloat10DY, direct, examine, fxtract, esp - 15 digits
1051  cycles, ConvertReal10DY, direct, examine, fxtract, esp - 15 digits
1066  cycles, ConvertFloat10ZX, BCD - old - 15 digits
1068  cycles, ConvertFloat10Z, BCD -old - 15 digits
1094  cycles, ConvertReal10DYD, direct, examine, fxtract, esp - 15 digits
1097  cycles, ConvertFloat10DYD, direct, examine, fxtract, esp - 15 digits
1098  cycles, ConvertFloat10DXD, direct, fxam, fxtract, esp - 15 digits
1130  cycles, ConvertReal10DXD, direct, fxam, fxtract, esp - 15 digits
1141  cycles, ConvertFloat10DS, direct, fxam, fyl2x, ebp - 15 digits
1161  cycles, ConvertFloat10DF, direct, examine, fyl2x, ebp - 15 digits
1167  cycles, ConvertFloat10DFD, direct, examine, fyl2x, ebp - 15 digits
1170  cycles, ConvertFloat10DSD, direct, fxam, fyl2x, ebp - 15 digits
1173  cycles, ConvertReal10DS, direct, fxam, fyl2x, ebp - 15 digits
1176  cycles, ConvertReal10DFD, direct, examine, fyl2x, ebp - 15 digits
1181  cycles, ConvertReal10DSD, direct, fxam, fyl2x, ebp - 15 digits
1187  cycles, ConvertReal10DF, direct, examine, fyl2x, ebp - 15 digits
2938  cycles, ConvertFloat10, BCD, Save FPU -old - 15 digits
3024  cycles, ConvertReal10BW, BCD, Save FPU, fxam, fxtract, ebp - 15 digits
3027  cycles, ConvertFloat10BW, BCD, Save FPU, fxam, fxtract, ebp - 15 digits
3139  cycles, ConvertFloat10BWD, BCD, Save FPU, fxam, fxtract, ebp - 15 digits
3165  cycles, ConvertReal10BWD, BCD, Save FPU, fxam, fxtract, ebp - 15 digits
3344  cycles, ConvertReal10DWD, direct,Save FPU, fxam, fxtract, esp -15 digits
3356  cycles, ConvertFloat10DWD, direct,Save FPU, fxam, fxtract, esp -15 digits
3447  cycles, ConvertReal10DW, direct,Save FPU, fxam, fxtract, esp -15 digits
3463  cycles, ConvertFloat10DW, direct,Save FPU, fxam, fxtract, esp -15 digits
********** END **********

For 18 digits:
Quote
***** Time table *****

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

822  cycles, ConvertReal10BYD, BCD, examine, fxtract, esp - 18 digits
826  cycles, ConvertReal10BF, BCD, fxam, fxtract, esp - 18 digits
827  cycles, ConvertReal10BY, BCD, examine, fxtract, esp - 18 digits
827  cycles, ConvertFloat10BYD, BCD, examine, fxtract, esp - 18 digits
827  cycles, ConvertFloat10BF, BCD, fxam, fxtract, esp - 18 digits
830  cycles, ConvertFloat10BY, BCD, examine, fxtract, esp - 18 digits
831  cycles, ConvertReal10BFD, BCD, fxam, fxtract, esp - 18 digits
831  cycles, ConvertFloat10BFD, BCD, fxam, fxtract, esp - 18 digits
832  cycles, ConvertFloat10BXD, BCD, fxam, fxtract, ebp - 18 digits
833  cycles, ConvertReal10BXD, BCD, fxam, fxtract, ebp - 18 digits
836  cycles, ConvertFloat10BX, BCD, fxam, fxtract, ebp - 18 digits
856  cycles, ConvertReal10CT, BCD-CT, fxam, fxtract, esp - 18 digits
859  cycles, ConvertFloat10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
860  cycles, ConvertReal10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
870  cycles, ConvertReal10BX, BCD, fxam, fxtract, ebp - 18 digits
894  cycles, ConvertFloat10CT, BCD-CT, fxam, fxtract, esp - 18 digits
1080  cycles, ConvertFloat10Z, BCD -old - 18 digits
1085  cycles, ConvertFloat10ZX, BCD - old - 18 digits
1402  cycles, ConvertReal10DR, direct, examine, fxtract, ebp - 18 digits
1403  cycles, ConvertFloat10DR, direct, examine, fxtract, ebp - 18 digits
1409  cycles, ConvertReal10DRD, direct, examine, fxtract, ebp - 18 digits
1410  cycles, ConvertFloat10DX, direct, fxam, fxtract, esp - 18 digits
1412  cycles, ConvertReal10DX, direct, fxam, fxtract, esp - 18 digits
1429  cycles, ConvertReal10DY, direct, examine, fxtract, esp - 18 digits
1436  cycles, ConvertFloat10DY, direct, examine, fxtract, esp - 18 digits
1449  cycles, ConvertFloat10DRD, direct, examine, fxtract, ebp - 18 digits
1470  cycles, ConvertReal10DYD, direct, examine, fxtract, esp - 18 digits
1472  cycles, ConvertFloat10DYD, direct, examine, fxtract, esp - 18 digits
1472  cycles, ConvertReal10DXD, direct, fxam, fxtract, esp - 18 digits
1477  cycles, ConvertFloat10DXD, direct, fxam, fxtract, esp - 18 digits
1533  cycles, ConvertFloat10DFD, direct, examine, fyl2x, ebp - 18 digits
1538  cycles, ConvertReal10DFD, direct, examine, fyl2x, ebp - 18 digits
1550  cycles, ConvertFloat10DS, direct, fxam, fyl2x, ebp - 18 digits
1552  cycles, ConvertFloat10DF, direct, examine, fyl2x, ebp - 18 digits
1558  cycles, ConvertReal10DS, direct, fxam, fyl2x, ebp - 18 digits
1559  cycles, ConvertFloat10DSD, direct, fxam, fyl2x, ebp - 18 digits
1562  cycles, ConvertReal10DSD, direct, fxam, fyl2x, ebp - 18 digits
1566  cycles, ConvertReal10DF, direct, examine, fyl2x, ebp - 18 digits
3003  cycles, ConvertFloat10, BCD, Save FPU -old - 18 digits
3038  cycles, ConvertFloat10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3039  cycles, ConvertReal10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3157  cycles, ConvertFloat10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3165  cycles, ConvertReal10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3723  cycles, ConvertReal10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
3749  cycles, ConvertFloat10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
3843  cycles, ConvertFloat10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
3898  cycles, ConvertReal10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
********** END **********


For 19 digits- no BCD:
Quote
***** Time table *****

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

1546  cycles, ConvertFloat10DR, direct, examine, fxtract, ebp - 19 digits
1570  cycles, ConvertReal10DR, direct, examine, fxtract, ebp - 19 digits
1573  cycles, ConvertReal10DRD, direct, examine, fxtract, ebp - 19 digits
1584  cycles, ConvertFloat10DRD, direct, examine, fxtract, ebp - 19 digits
1592  cycles, ConvertFloat10DX, direct, fxam, fxtract, esp - 19 digits
1594  cycles, ConvertFloat10DY, direct, examine, fxtract, esp - 19 digits
1607  cycles, ConvertReal10DX, direct, fxam, fxtract, esp - 19 digits
1609  cycles, ConvertReal10DY, direct, examine, fxtract, esp - 19 digits
1635  cycles, ConvertReal10DYD, direct, examine, fxtract, esp - 19 digits
1663  cycles, ConvertFloat10DXD, direct, fxam, fxtract, esp - 19 digits
1675  cycles, ConvertFloat10DYD, direct, examine, fxtract, esp - 19 digits
1705  cycles, ConvertReal10DXD, direct, fxam, fxtract, esp - 19 digits
1727  cycles, ConvertFloat10DFD, direct, examine, fyl2x, ebp - 19 digits
1728  cycles, ConvertFloat10DS, direct, fxam, fyl2x, ebp - 19 digits
1728  cycles, ConvertFloat10DSD, direct, fxam, fyl2x, ebp - 19 digits
1729  cycles, ConvertFloat10DF, direct, examine, fyl2x, ebp - 19 digits
1731  cycles, ConvertReal10DF, direct, examine, fyl2x, ebp - 19 digits
1740  cycles, ConvertReal10DS, direct, fxam, fyl2x, ebp - 19 digits
1745  cycles, ConvertReal10DSD, direct, fxam, fyl2x, ebp - 19 digits
1765  cycles, ConvertReal10DFD, direct, examine, fyl2x, ebp - 19 digits
3893  cycles, ConvertFloat10DWD, direct,Save FPU, fxam, fxtract, esp -19 digits
3904  cycles, ConvertReal10DWD, direct,Save FPU, fxam, fxtract, esp -19 digits
3976  cycles, ConvertReal10DW, direct,Save FPU, fxam, fxtract, esp -19 digits
3982  cycles, ConvertFloat10DW, direct,Save FPU, fxam, fxtract, esp -19 digits
********** END **********
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 12, 2013, 09:16:39 PM
Hi, RuiLoureiro!
This is my procedure for Converting a Real10 to string and it's faster your procedure
The accuracy of this procedure is 19 digits
; masm windows console #
.686
.model flat
include windows.inc
includelib user32.lib
includelib kernel32.lib
extern _imp__MessageBoxA@16:dword
extern _imp__ExitProcess@4:dword
extern _imp__GetStdHandle@4:dword;
extern _imp__WriteConsoleA@20:dword;
extern _imp__SetConsoleTitleA@4:dword;
extern _imp__SetConsoleScreenBufferSize@8:dword;
extern _imp__FreeConsole@0:dword;
extern _imp__AllocConsole@0:dword;
extern _imp__CharToOemA@8:dword
extern _imp__ReadConsoleA@20:dword
STD_OUTPUT_HANDLE    equ -11;для вывода
STD_INPUT_HANDLE     equ -10;для ввода
$max equ 60; <-- This number may be increased
magic1 equ 4D10h;lg(2)*65536=19728,3...
magic2  equ 35269h;log2(10)*65536=3,32192809488736234780*65536=217705,8796265381788254208..
.data
dt 1.0e$max
dw 0
irp k,<59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,\
       38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,\
       16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1>
dt 1.0e&k
dw 0
endm
tabs dt 1.0
dw 0
irp k,<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,\
       26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,\
       48,49,50,51,52,53,54,55,56,57,58,59,$max>
dt 1.0e-&k
dw 0
endm
table0 db "000102030405060708091011121314151617181920212223242526272829"
       db "303132333435363738394041424344454647484950515253545556575859"
       db "606162636465666768697071727374757677787980818283848586878889"
       db "90919293949596979899"
table1 dd shift0,shift1,shift2,shift3,shift4
string db 40 dup(0)
crd COORD <20,225>
HANDL  dd ?
HANDL1 dd ?
TITL db 0
STR1 db 'Press Enter to continue'
LENS db ?
xxx dt 000008000000000000000r;=3.3621031431120935E-4932
dt 00000FFFFFFFFFFFFFFFFr;6.724206286224187E-4932
;dt 000000000000000000001r; =ERROR
dt 07FFF8000000000000000r;  Infinity
dt 0FFFF8000000000000000r; -Infinity
dt 0FFFFC000000000000000r; -Uncertainty
dt 07FFFC000000000000000r;  Uncertainty
dt 07FFF9000000000000000r;  Signal Non a Number
dt 0FFFF9000000000000000r; -Signal Non a Number
dt 0FFFFD000000000000000r; -Quiet Non a Number
dt 07FFFD000000000000000r;  Quiet Non a Number
dt 07FFF7000000000000000r;  Error
dt 0FFFF7000000000000000r; -Error
dt 07FFEFFFFFFFFFFFFFFFFr; = 1.18973149535723177E+4932
dt 0FFFEFFFFFFFFFFFFFFFFr; =-1.18973149535723177E+4932
dt -0.0
dt 0
dt 1.0
dt 2.0
dt 3.0
dt 4.0
dt 5.0
dt 6.0
dt 7.0
dt 8.0
dt 9.0
dt 0.1
dt 0.2
dt 0.3
dt 0.4
dt 0.5
dt 0.6
dt 0.7
dt 0.8
dt 0.9
dt -1.1
dt -11.1
dt -111.1
dt -1111.1
dt -11111.1 
dt -111111.1
dt -1111111.1
dt -11111111.1
dt -111111111.1
dt -1111111111.1
dt -11111111111.1
dt -111111111111.1
dt -1111111111111.1
dt -11111111111111.1
dt -111111111111111.1
dt -1111111111111111.1
dt -11111111111111111.1
dt -111111111111111111.1
dt -1111111111111111111.1
dt -2.2
dt -22.2
dt -222.2
dt -2222.2
dt -22222.2
dt -222222.2
dt -2222222.2
dt -22222222.2
dt -222222222.2
dt -2222222222.2
dt -22222222222.2
dt -222222222222.2
dt -2222222222222.2
dt -22222222222222.2
dt -222222222222222.2
dt -2222222222222222.2
dt -22222222222222222.2
dt -222222222222222222.2
dt -2222222222222222222.2
dt -3.3
dt -33.3
dt -333.3
dt -3333.3
dt -33333.3
dt -333333.3
dt -3333333.3
dt -33333333.3
dt -333333333.3
dt -3333333333.3
dt -33333333333.3
dt -333333333333.3
dt -3333333333333.3
dt -33333333333333.3
dt -333333333333333.3
dt -3333333333333333.3
dt -33333333333333333.3
dt -333333333333333333.3
dt -3333333333333333333.3
dt -4.4
dt -44.4
dt -444.4
dt -4444.4
dt -44444.4
dt -444444.4
dt -4444444.4
dt -44444444.4
dt -444444444.4
dt -4444444444.4
dt -44444444444.4
dt -444444444444.4
dt -4444444444444.4
dt -44444444444444.4
dt -444444444444444.4
dt -4444444444444444.4
dt -44444444444444444.4
dt -444444444444444444.4
dt -4444444444444444444.4
dt -5.5
dt -55.5
dt -555.5
dt -5555.5
dt -55555.5
dt -555555.5
dt -5555555.5
dt -55555555.5
dt -555555555.5
dt -5555555555.5
dt -55555555555.5
dt -555555555555.5
dt -5555555555555.5
dt -55555555555555.5
dt -555555555555555.5
dt -5555555555555555.5
dt -55555555555555555.5
dt -555555555555555555.5
dt -5555555555555555555.5
dt -6.6
dt -66.6
dt -666.6
dt -6666.6
dt -66666.6
dt -666666.6
dt -6666666.6
dt -66666666.6
dt -666666666.6
dt -6666666666.6
dt -66666666666.6
dt -666666666666.6
dt -6666666666666.6
dt -66666666666666.6
dt -666666666666666.6
dt -6666666666666666.6
dt -66666666666666666.6
dt -666666666666666666.6
dt -6666666666666666666.6
dt -7.7
dt -77.7
dt -777.7
dt -7777.7
dt -77777.7
dt -777777.7
dt -7777777.7
dt -77777777.7
dt -777777777.7
dt -7777777777.7
dt -77777777777.7
dt -777777777777.7
dt -7777777777777.7
dt -77777777777777.7 ;ecx=3
dt -777777777777777.7
dt -7777777777777777.7
dt -77777777777777777.7
dt -777777777777777777.7
dt -7777777777777777777.7
dt -8.8
dt -88.8
dt -888.8
dt -8888.8
dt -88888.8
dt -888888.8
dt -8888888.8;ecx=4
dt -88888888.8
dt -888888888.8
dt -8888888888.8
dt -88888888888.8
dt -888888888888.8
dt -8888888888888.8
dt -88888888888888.8
dt -888888888888888.8
dt -8888888888888888.8
dt -88888888888888888.8
dt -888888888888888888.8
dt -8888888888888888888.8
dt -9.9
dt -99.9;the result of multiplying is -9.9900000000000000010
dt -999.9
dt -9999.9
dt -99999.9
dt -999999.9
dt -9999999.9
dt -99999999.9
dt -999999999.9;-9.9999999990000000010
dt -9999999999.9;ecx=4
dt -99999999999.9
dt -999999999999.9
dt -9999999999999.9;the result of multiplying is -9.9999999999998999990
dt -99999999999999.9
dt -999999999999999.9
dt -9999999999999999.9
dt -99999999999999999.9
dt -999999999999999999.9
dt -9999999999999999999.9
dt  0.1
dt  0.01
dt  0.001
dt  0.0001
dt  0.00001
dt  0.000001
dt  0.0000001
dt  0.00000001
dt  0.000000001
dt  0.0000000001
dt  0.00000000001
dt  0.000000000001
dt  0.0000000000001
dt  0.00000000000001
dt  0.000000000000001
dt  0.0000000000000001
dt  0.00000000000000001
dt  1.0E-18
dt  0.2
dt  0.02
dt  0.002
dt  0.0002
dt  0.00002
dt  0.000002
dt  0.0000002
dt  0.00000002
dt  0.000000002
dt  0.0000000002
dt  0.00000000002
dt  0.000000000002
dt  0.0000000000002
dt  0.00000000000002
dt  0.000000000000002
dt  0.0000000000000002
dt  0.00000000000000002
dt  2.0E-18
dt  0.3
dt  0.03
dt  0.003
dt  0.0003
dt  0.00003
dt  0.000003
dt  0.0000003
dt  0.00000003
dt  0.000000003
dt  0.0000000003
dt  0.00000000003
dt  0.000000000003
dt  0.0000000000003
dt  0.00000000000003
dt  0.000000000000003
dt  0.0000000000000003
dt  0.00000000000000003
dt  3.0E-18
dt  0.4
dt  0.04
dt  0.004
dt  0.0004
dt  0.00004
dt  0.000004
dt  0.0000004
dt  0.00000004
dt  0.000000004
dt  0.0000000004
dt  0.00000000004
dt  0.000000000004
dt  0.0000000000004
dt  0.00000000000004
dt  0.000000000000004
dt  0.0000000000000004
dt  0.00000000000000004
dt  4.0E-18
dt  0.5
dt  0.05
dt  0.005
dt  0.0005
dt  0.00005
dt  0.000005
dt  0.0000005
dt  0.00000005
dt  0.000000005
dt  0.0000000005
dt  0.00000000005
dt  0.000000000005
dt  0.0000000000005
dt  0.00000000000005
dt  0.000000000000005
dt  0.0000000000000005
dt  0.00000000000000005
dt  5.0E-18
dt  0.6
dt  0.06
dt  0.006
dt  0.0006
dt  0.00006
dt  0.000006
dt  0.0000006
dt  0.00000006
dt  0.000000006
dt  0.0000000006
dt  0.00000000006
dt  0.000000000006
dt  0.0000000000006
dt  0.00000000000006
dt  0.000000000000006
dt  0.0000000000000006
dt  0.00000000000000006
dt  6.0E-18
dt  0.7
dt  0.07
dt  0.007
dt  0.0007
dt  0.00007
dt  0.000007
dt  0.0000007
dt  0.00000007
dt  0.000000007
dt  0.0000000007
dt  0.00000000007
dt  0.000000000007
dt  0.0000000000007
dt  0.00000000000007
dt  0.000000000000007
dt  0.0000000000000007
dt  0.00000000000000007
dt  7.0E-18
dt  0.8
dt  0.08
dt  0.008
dt  0.0008
dt  0.00008
dt  0.000008
dt  0.0000008
dt  0.00000008
dt  0.000000008
dt  0.0000000008
dt  0.00000000008
dt  0.000000000008
dt  0.0000000000008
dt  0.00000000000008
dt  0.000000000000008
dt  0.0000000000000008
dt  0.00000000000000008
dt  8.0E-18
dt  0.9
dt  0.09
dt  0.009
dt  0.0009
dt  0.00009
dt  0.000009
dt  0.0000009
dt  0.00000009
dt  0.000000009
dt  0.0000000009
dt  0.00000000009
dt  0.000000000009
dt  0.0000000000009
dt  0.00000000000009
dt  0.000000000000009
dt  0.0000000000000009
dt  0.00000000000000009
dt  9.0E-18
dt -1.23456789123456
dt -12.3456789123456
dt -123.456789123456
dt -1234.56789123456
dt -12345.6789123456
dt -123456.789123456
dt -1234567.89123456
dt -12345678.9123456
dt -12345678.9123456
dt -123456789.123456
dt -1234567891.123456
dt -12345678912.123456
dt -123456789123.123456
dt -1234567891234.123456
dt -12345678912345.12345
dt -123456789123456.1234
dt -1234567891234567.123
dt -12345678912345678.12
dt -123456789123456789.1
dt -1234567891234567891.0
num = ($ - xxx)/10
.code
start: call _imp__FreeConsole@0;free the existing console
        call _imp__AllocConsole@0;we form a console
        push STD_INPUT_HANDLE
        call _imp__GetStdHandle@4;HANDL1 obtain input
        mov HANDL1,eax
        push STD_OUTPUT_HANDLE
        call _imp__GetStdHandle@4;HANDL get to output
        mov HANDL,eax
push crd
push eax
call _imp__SetConsoleScreenBufferSize@8
        push offset TITL
        call _imp__SetConsoleTitleA@4;definition window title
mov ebx,offset xxx
mov ecx,num/24
a11: push ecx
mov ecx,24
@@: push ecx
push offset string
push ebx
call Eprst
        push 0
        push offset LENS
        push dword ptr string
        push offset string+4
        push HANDL
        call _imp__WriteConsoleA@20;we derive a string of characters
add ebx,10
pop ecx
loop @b
push 0
        push offset LENS
        push 23
        push offset STR1
        push HANDL
        call _imp__WriteConsoleA@20;we derive a string of characters
push 0
        push offset LENS
        push 200
        push offset string
        push HANDL1
        call _imp__ReadConsoleA@20;waiting to enter a string of characters
pop ecx
loop a11
mov ecx,(num mod 24)
jecxz a12
@@: push ecx
push offset string
push ebx
call Eprst
        push 0
        push offset LENS
        push dword ptr string
        push offset string+4
        push HANDL
        call _imp__WriteConsoleA@20;we derive a string of characters
add ebx,10
pop ecx
loop @b

a12:    push 0
        push offset LENS
        push 200
        push offset string
        push HANDL1
        call _imp__ReadConsoleA@20;waiting to enter a string of characters
push 0
call _imp__ExitProcess@4
;===================================================
Eprst proc uses edi esi ebx lpReal10:dword,lpDest:dword
local iExp:dword
local x[3]:dword
local temp1:dword
local temp2:dword
fninit
        mov ecx,lpReal10
fld tbyte ptr [ecx]
mov edi,lpDest
mov ebx,[ecx]
add edi,4
mov eax,[ecx+4]
mov [x],ebx
movzx edx,word ptr [ecx+8]
mov [x+4],eax
mov [x+8],edx
cmp edx,8000h
mov byte ptr [edi],'-'
sbb esi,esi
and esi,0Dh
sub [edi],esi
and edx,7FFFh
jnz a2
Zero_Or_Denormal: cmp edx,eax
jnz Denormal
        cmp ebx,eax
jnz Denormal
mov dword ptr [edi+1],'oreZ'
mov word ptr  [edi+5],0A0Dh
mov dword ptr [edi-4],7
        ret
a2: cmp edx,7FFFh
jz Infinity_Or_SNAN_Or_QNAN_Or_Uncertainty
Denormal:mov esi,10
sub edx,16383
mov word ptr [edi+21],'+E'
imul edx,magic1
mov word ptr [edi+27],0A0Dh
and edx,0FFFF0000h
mov dword ptr [edi-4],29
sar edx,14
mov iExp,edx
jz @f
cmp edx,4*$max
jg a1
cmp edx,-4*$max
jge load
;------------------------------------------------
dec edx
a1: not edx
sar edx,2
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
load: fld tabs[edx+edx*2]
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
jmp table1[ecx*4]
shift4::test eax,60000000h
jz a6
fld tabs[12]
fmul
add iExp,4
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
shift3::shld edx,eax,3
shld eax,ebx,3
shl ebx,3
add ebx,9;10
jmp shift0
shift2::shld edx,eax,2
shld eax,ebx,2
shl ebx,2
add ebx,8
jmp shift0
shift1::shld edx,eax,1
shld eax,ebx,1
shl ebx,1
add ebx,4
shift0::adc eax,0
adc edx,0
mov [edi+1],dl
mov byte ptr [edi+2],','
or byte ptr [edi+1],'0'
k=3
rept 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
mov edx,eax
sar eax,2
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 ax,word ptr table0[edx*2] ;edx = quotient of the division by 100
mov word ptr [edi+23],ax
lea eax,[edx*4]
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 ax,word ptr table0[esi*2]
        mov word ptr [edi+25],ax
ret
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
        mov dword ptr [edi+1],'ifnI'
        mov dword ptr [edi+5],'ytin'
        mov word ptr  [edi+9],0A0Dh
mov dword ptr [edi-4],11
ret
SNAN_Or_QNAN_Or_Uncertainty:
test eax,eax
jns error
test eax,40000000h
jnz QNAN
        mov dword ptr [edi+1],'ngiS'
        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],0D726562h;'reb'
        mov dword ptr [edi+21],0Ah
mov dword ptr [edi-4],22
ret
QNAN: test eax,3FFFFFFFh
jnz @f
test ebx,ebx
jnz @f
        mov dword ptr [edi+1],'ecnU'
        mov dword ptr [edi+5],'iatr'
        mov dword ptr [edi+9],0D79746Eh;'ytn'
        mov byte ptr [edi+13],0Ah
mov dword ptr [edi-4],14
ret
@@: mov dword ptr [edi+1],'eiuQ'
        mov dword ptr [edi+5],'oN t'
        mov dword ptr [edi+9],' a n'
        mov dword ptr [edi+13],'bmuN'
        mov dword ptr [edi+17],0A0D7265h;'re'
mov dword ptr [edi-4],21
ret
error: mov dword ptr [edi+1],'orrE'
        mov dword ptr [edi+5],0A0D72h;'r'
mov dword ptr [edi-4],8
ret
Eprst endp
end start
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 13, 2013, 03:49:03 AM
Hi Mikl

This is what i get when i try to assemble your file
See the asm file Mikl1.zip

Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

Assembling: C:\MASM32\Converters_1\TestQQ1\Mikl1.asm
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(66) : error A2071: initializer magnitud
e too large for specified size
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(67) : error A2071: initializer magnitud
e too large for specified size
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(69) : error A2071: initializer magnitud
e too large for specified size
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(70) : error A2071: initializer magnitud
e too large for specified size
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(71) : error A2071: initializer magnitud
e too large for specified size
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(72) : error A2071: initializer magnitud
e too large for specified size
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(73) : error A2071: initializer magnitud
e too large for specified size
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(74) : error A2071: initializer magnitud
e too large for specified size
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(75) : error A2071: initializer magnitud
e too large for specified size
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(76) : error A2071: initializer magnitud
e too large for specified size
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(77) : error A2071: initializer magnitud
e too large for specified size
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(78) : error A2071: initializer magnitud
e too large for specified size
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(79) : error A2071: initializer magnitud
e too large for specified size
C:\MASM32\Converters_1\TestQQ1\Mikl1.asm(80) : error A2071: initializer magnitud
e too large for specified size
_

Assembly Error
Prima qualquer tecla para continuar . . . (this is: press any key to continue)

If i use this set of data


Eprst   proto   :DWORD,:DWORD
$max equ 60; <-- This number may be increased
magic1  equ 4D10h   ;lg(2)*65536=19728,3...
magic2  equ 35269h  ;log2(10)*65536=3,32192809488736234780*65536=217705,8796265381788254208..
; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
.data

dt 1.0e$max
dw 0
irp k,<59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,\
       38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,\
       16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1>
dt 1.0e&k
dw 0
endm
tabs dt 1.0
dw 0
irp k,<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,\
       26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,\
       48,49,50,51,52,53,54,55,56,57,58,59,$max>
dt 1.0e-&k
dw 0
endm

table0 db "000102030405060708091011121314151617181920212223242526272829"
       db "303132333435363738394041424344454647484950515253545556575859"
       db "606162636465666768697071727374757677787980818283848586878889"
       db "90919293949596979899"
table1 dd shift0,shift1,shift2,shift3,shift4


and this procedure


Eprst proc uses edi esi ebx lpReal10:dword,lpDest:dword
local iExp:dword
local x[3]:dword
local temp1:dword
local temp2:dword
fninit
        mov ecx,lpReal10
fld tbyte ptr [ecx]
mov edi,lpDest
mov ebx,[ecx]
add edi,4
mov eax,[ecx+4]
mov [x],ebx
movzx edx,word ptr [ecx+8]
mov [x+4],eax
mov [x+8],edx
cmp edx,8000h
mov byte ptr [edi],'-'
sbb esi,esi
and esi,0Dh
sub [edi],esi
and edx,7FFFh
jnz a2
Zero_Or_Denormal: cmp edx,eax
jnz Denormal
        cmp ebx,eax
jnz Denormal
mov dword ptr [edi+1],'oreZ'
mov word ptr  [edi+5],0A0Dh
mov dword ptr [edi-4],7
        ret
a2: cmp edx,7FFFh
jz Infinity_Or_SNAN_Or_QNAN_Or_Uncertainty
Denormal:mov esi,10
sub edx,16383
mov word ptr [edi+21],'+E'
imul edx,magic1
mov word ptr [edi+27],0A0Dh
and edx,0FFFF0000h
mov dword ptr [edi-4],29
sar edx,14
mov iExp,edx
jz @f
cmp edx,4*$max
jg a1
cmp edx,-4*$max
jge load
;------------------------------------------------
dec edx
a1: not edx
sar edx,2
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
load: fld tabs[edx+edx*2]
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
jmp table1[ecx*4]
shift4::test eax,60000000h
jz a6
fld tabs[12]
fmul
add iExp,4
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
shift3::shld edx,eax,3
shld eax,ebx,3
shl ebx,3
add ebx,9;10
jmp shift0
shift2::shld edx,eax,2
shld eax,ebx,2
shl ebx,2
add ebx,8
jmp shift0
shift1::shld edx,eax,1
shld eax,ebx,1
shl ebx,1
add ebx,4
shift0::adc eax,0
adc edx,0
mov [edi+1],dl
mov byte ptr [edi+2],','
or byte ptr [edi+1],'0'
k=3
rept 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
mov edx,eax
sar eax,2
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 ax,word ptr table0[edx*2] ;edx = quotient of the division by 100
mov word ptr [edi+23],ax
lea eax,[edx*4]
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 ax,word ptr table0[esi*2]
        mov word ptr [edi+25],ax
ret
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
        mov dword ptr [edi+1],'ifnI'
        mov dword ptr [edi+5],'ytin'
        mov word ptr  [edi+9],0A0Dh
mov dword ptr [edi-4],11
ret
SNAN_Or_QNAN_Or_Uncertainty:
test eax,eax
jns error
test eax,40000000h
jnz QNAN
        mov dword ptr [edi+1],'ngiS'
        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],0D726562h;'reb'
        mov dword ptr [edi+21],0Ah
mov dword ptr [edi-4],22
ret
QNAN: test eax,3FFFFFFFh
jnz @f
test ebx,ebx
jnz @f
        mov dword ptr [edi+1],'ecnU'
        mov dword ptr [edi+5],'iatr'
        mov dword ptr [edi+9],0D79746Eh;'ytn'
        mov byte ptr [edi+13],0Ah
mov dword ptr [edi-4],14
ret
@@: mov dword ptr [edi+1],'eiuQ'
        mov dword ptr [edi+5],'oN t'
        mov dword ptr [edi+9],' a n'
        mov dword ptr [edi+13],'bmuN'
        mov dword ptr [edi+17],0A0D7265h;'re'
mov dword ptr [edi-4],21
ret
error: mov dword ptr [edi+1],'orrE'
        mov dword ptr [edi+5],0A0D72h;'r'
mov dword ptr [edi-4],8
ret
Eprst endp


        It doesnt convert anything
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 13, 2013, 11:17:25 AM
repetição
; masm windows console #
      .686                      ; create 32 bit code
      .model flat, stdcall      ; 32 bit memory model
      option casemap :none      ; case sensitive

       include \masm32\include\windows.inc
       includelib \masm32\lib\user32.lib
       includelib \masm32\lib\kernel32.lib

extern _imp__ExitProcess@4:dword
extern _imp__GetStdHandle@4:dword;
extern _imp__WriteConsoleA@20:dword;
extern _imp__SetConsoleTitleA@4:dword;
extern _imp__SetConsoleScreenBufferSize@8:dword;
extern _imp__FreeConsole@0:dword;
extern _imp__AllocConsole@0:dword;
extern _imp__CharToOemA@8:dword
extern _imp__ReadConsoleA@20:dword
$max equ 60; <-- This number may be increased

magic1  equ 4D10h;lg(2)*65536=19728,3...
magic2  equ 35269h;log2(10)*65536=3,32192809488736234780*65536=217705,8796265381788254208..
.data
dt 1.0e$max
dw 0
irp k,<59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,\
       38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,\
       16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1>
dt 1.0e&k
dw 0
endm
tabs dt 1.0
dw 0
irp k,<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,\
       26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,\
       48,49,50,51,52,53,54,55,56,57,58,59,$max>
dt 1.0e-&k
dw 0
endm
table0 db "000102030405060708091011121314151617181920212223242526272829"
       db "303132333435363738394041424344454647484950515253545556575859"
       db "606162636465666768697071727374757677787980818283848586878889"
       db "90919293949596979899"
table1 dd shift0,shift1,shift2,shift3,shift4
string db 40 dup(0)
crd COORD <40,225>
HANDL  dd ?
HANDL1 dd ?
TITL db 0
STR1 db 'Prima qualquer tecla para continuar...';'Press Enter to continue'
LENS db ?
xxx db 0,0,0,0,0,0,0,80h,0,0;=3.3621031431120935E-4932
db 8 dup(0FFh),0,0;6.724206286224187E-4932
db 1,9 dup(0); =ERROR
dd 0,80000000h
dw 7FFFh      ;  Infinity
dd 0,80000000h
dw 0FFFFh     ; -Infinity
dd 0,0C0000000h
dw 0FFFFh; -Uncertainty
dd 0,0C0000000h
dw 7FFFh;  Uncertainty
dd 0,90000000h
dw 7FFFh;  Signal Non a Number
dd 0,90000000h
dw 0FFFFh; -Signal Non a Number
dd 0,0D0000000h
dw 0FFFFh; -Quiet Non a Number
dd 0,0D0000000h
dw 7FFFh;  Quiet Non a Number
dd 0,70000000h
dw 07FFFh;  Error
dd 0,70000000h
dw 0FFFFh; -Error
dd 0FFFFFFFFh,0FFFFFFFFh
dw 07FFEh; = 1.18973149535723177E+4932
dd 0FFFFFFFFh,0FFFFFFFFh
dw 0FFFEh; =-1.18973149535723177E+4932
dt -0.0
dt 0
dt 1.0
dt 2.0
dt 3.0
dt 4.0
dt 5.0
dt 6.0
dt 7.0
dt 8.0
dt 9.0
dt 0.1
dt 0.2
dt 0.3
dt 0.4
dt 0.5
dt 0.6
dt 0.7
dt 0.8
dt 0.9
dt -1.1
dt -11.1
dt -111.1
dt -1111.1
dt -11111.1 
dt -111111.1
dt -1111111.1
dt -11111111.1
dt -111111111.1
dt -1111111111.1
dt -11111111111.1
dt -111111111111.1
dt -1111111111111.1
dt -11111111111111.1
dt -111111111111111.1
dt -1111111111111111.1
dt -11111111111111111.1
dt -111111111111111111.1
dt -1111111111111111111.1
dt -2.2
dt -22.2
dt -222.2
dt -2222.2
dt -22222.2
dt -222222.2
dt -2222222.2
dt -22222222.2
dt -222222222.2
dt -2222222222.2
dt -22222222222.2
dt -222222222222.2
dt -2222222222222.2
dt -22222222222222.2
dt -222222222222222.2
dt -2222222222222222.2
dt -22222222222222222.2
dt -222222222222222222.2
dt -2222222222222222222.2
dt -3.3
dt -33.3
dt -333.3
dt -3333.3
dt -33333.3
dt -333333.3
dt -3333333.3
dt -33333333.3
dt -333333333.3
dt -3333333333.3
dt -33333333333.3
dt -333333333333.3
dt -3333333333333.3
dt -33333333333333.3
dt -333333333333333.3
dt -3333333333333333.3
dt -33333333333333333.3
dt -333333333333333333.3
dt -3333333333333333333.3
dt -4.4
dt -44.4
dt -444.4
dt -4444.4
dt -44444.4
dt -444444.4
dt -4444444.4
dt -44444444.4
dt -444444444.4
dt -4444444444.4
dt -44444444444.4
dt -444444444444.4
dt -4444444444444.4
dt -44444444444444.4
dt -444444444444444.4
dt -4444444444444444.4
dt -44444444444444444.4
dt -444444444444444444.4
dt -4444444444444444444.4
dt -5.5
dt -55.5
dt -555.5
dt -5555.5
dt -55555.5
dt -555555.5
dt -5555555.5
dt -55555555.5
dt -555555555.5
dt -5555555555.5
dt -55555555555.5
dt -555555555555.5
dt -5555555555555.5
dt -55555555555555.5
dt -555555555555555.5
dt -5555555555555555.5
dt -55555555555555555.5
dt -555555555555555555.5
dt -5555555555555555555.5
dt -6.6
dt -66.6
dt -666.6
dt -6666.6
dt -66666.6
dt -666666.6
dt -6666666.6
dt -66666666.6
dt -666666666.6
dt -6666666666.6
dt -66666666666.6
dt -666666666666.6
dt -6666666666666.6
dt -66666666666666.6
dt -666666666666666.6
dt -6666666666666666.6
dt -66666666666666666.6
dt -666666666666666666.6
dt -6666666666666666666.6
dt -7.7
dt -77.7
dt -777.7
dt -7777.7
dt -77777.7
dt -777777.7
dt -7777777.7
dt -77777777.7
dt -777777777.7
dt -7777777777.7
dt -77777777777.7
dt -777777777777.7
dt -7777777777777.7
dt -77777777777777.7 ;ecx=3
dt -777777777777777.7
dt -7777777777777777.7
dt -77777777777777777.7
dt -777777777777777777.7
dt -7777777777777777777.7
dt -8.8
dt -88.8
dt -888.8
dt -8888.8
dt -88888.8
dt -888888.8
dt -8888888.8;ecx=4
dt -88888888.8
dt -888888888.8
dt -8888888888.8
dt -88888888888.8
dt -888888888888.8
dt -8888888888888.8
dt -88888888888888.8
dt -888888888888888.8
dt -8888888888888888.8
dt -88888888888888888.8
dt -888888888888888888.8
dt -8888888888888888888.8
dt -9.9
dt -99.9;the result of multiplying is -9.9900000000000000010
dt -999.9
dt -9999.9
dt -99999.9
dt -999999.9
dt -9999999.9
dt -99999999.9
dt -999999999.9;-9.9999999990000000010
dt -9999999999.9;ecx=4
dt -99999999999.9
dt -999999999999.9
dt -9999999999999.9;the result of multiplying is -9.9999999999998999990
dt -99999999999999.9
dt -999999999999999.9
dt -9999999999999999.9
dt -99999999999999999.9
dt -999999999999999999.9
dt -9999999999999999999.9
dt  0.1
dt  0.01
dt  0.001
dt  0.0001
dt  0.00001
dt  0.000001
dt  0.0000001
dt  0.00000001
dt  0.000000001
dt  0.0000000001
dt  0.00000000001
dt  0.000000000001
dt  0.0000000000001
dt  0.00000000000001
dt  0.000000000000001
dt  0.0000000000000001
dt  0.00000000000000001
dt  1.0E-18
dt  0.2
dt  0.02
dt  0.002
dt  0.0002
dt  0.00002
dt  0.000002
dt  0.0000002
dt  0.00000002
dt  0.000000002
dt  0.0000000002
dt  0.00000000002
dt  0.000000000002
dt  0.0000000000002
dt  0.00000000000002
dt  0.000000000000002
dt  0.0000000000000002
dt  0.00000000000000002
dt  2.0E-18
dt  0.3
dt  0.03
dt  0.003
dt  0.0003
dt  0.00003
dt  0.000003
dt  0.0000003
dt  0.00000003
dt  0.000000003
dt  0.0000000003
dt  0.00000000003
dt  0.000000000003
dt  0.0000000000003
dt  0.00000000000003
dt  0.000000000000003
dt  0.0000000000000003
dt  0.00000000000000003
dt  3.0E-18
dt  0.4
dt  0.04
dt  0.004
dt  0.0004
dt  0.00004
dt  0.000004
dt  0.0000004
dt  0.00000004
dt  0.000000004
dt  0.0000000004
dt  0.00000000004
dt  0.000000000004
dt  0.0000000000004
dt  0.00000000000004
dt  0.000000000000004
dt  0.0000000000000004
dt  0.00000000000000004
dt  4.0E-18
dt  0.5
dt  0.05
dt  0.005
dt  0.0005
dt  0.00005
dt  0.000005
dt  0.0000005
dt  0.00000005
dt  0.000000005
dt  0.0000000005
dt  0.00000000005
dt  0.000000000005
dt  0.0000000000005
dt  0.00000000000005
dt  0.000000000000005
dt  0.0000000000000005
dt  0.00000000000000005
dt  5.0E-18
dt  0.6
dt  0.06
dt  0.006
dt  0.0006
dt  0.00006
dt  0.000006
dt  0.0000006
dt  0.00000006
dt  0.000000006
dt  0.0000000006
dt  0.00000000006
dt  0.000000000006
dt  0.0000000000006
dt  0.00000000000006
dt  0.000000000000006
dt  0.0000000000000006
dt  0.00000000000000006
dt  6.0E-18
dt  0.7
dt  0.07
dt  0.007
dt  0.0007
dt  0.00007
dt  0.000007
dt  0.0000007
dt  0.00000007
dt  0.000000007
dt  0.0000000007
dt  0.00000000007
dt  0.000000000007
dt  0.0000000000007
dt  0.00000000000007
dt  0.000000000000007
dt  0.0000000000000007
dt  0.00000000000000007
dt  7.0E-18
dt  0.8
dt  0.08
dt  0.008
dt  0.0008
dt  0.00008
dt  0.000008
dt  0.0000008
dt  0.00000008
dt  0.000000008
dt  0.0000000008
dt  0.00000000008
dt  0.000000000008
dt  0.0000000000008
dt  0.00000000000008
dt  0.000000000000008
dt  0.0000000000000008
dt  0.00000000000000008
dt  8.0E-18
dt  0.9
dt  0.09
dt  0.009
dt  0.0009
dt  0.00009
dt  0.000009
dt  0.0000009
dt  0.00000009
dt  0.000000009
dt  0.0000000009
dt  0.00000000009
dt  0.000000000009
dt  0.0000000000009
dt  0.00000000000009
dt  0.000000000000009
dt  0.0000000000000009
dt  0.00000000000000009
dt  9.0E-18
dt -1.23456789123456
dt -12.3456789123456
dt -123.456789123456
dt -1234.56789123456
dt -12345.6789123456
dt -123456.789123456
dt -1234567.89123456
dt -12345678.9123456
dt -12345678.9123456
dt -123456789.123456
dt -1234567891.123456
dt -12345678912.123456
dt -123456789123.123456
dt -1234567891234.123456
dt -12345678912345.12345
dt -123456789123456.1234
dt -1234567891234567.123
dt -12345678912345678.12
dt -123456789123456789.1
dt -1234567891234567891.0
num = ($ - xxx)/10
.code
start: call _imp__FreeConsole@0;free the existing console
        call _imp__AllocConsole@0;we form a console
        push STD_INPUT_HANDLE
        call _imp__GetStdHandle@4;HANDL1 obtain input
        mov HANDL1,eax
        push STD_OUTPUT_HANDLE
        call _imp__GetStdHandle@4;HANDL get to output
        mov HANDL,eax
push crd
push eax
call _imp__SetConsoleScreenBufferSize@8
        push offset TITL
        call _imp__SetConsoleTitleA@4;definition window title
mov ebx,offset xxx
mov ecx,num/24
a11: push ecx
mov ecx,24
@@: push ecx
push offset string
push ebx
call Eprst
        push 0
        push offset LENS
        push dword ptr string
        push offset string+4
        push HANDL
        call _imp__WriteConsoleA@20;we derive a string of characters
add ebx,10
pop ecx
loop @b
push 0
        push offset LENS
        push 38
        push offset STR1
        push HANDL
        call _imp__WriteConsoleA@20;we derive a string of characters
push 0
        push offset LENS
        push 200
        push offset string
        push HANDL1
        call _imp__ReadConsoleA@20;waiting to enter a string of characters
pop ecx
loop a11
mov ecx,(num mod 24)
jecxz a12
@@: push ecx
push offset string
push ebx
call Eprst
        push 0
        push offset LENS
        push dword ptr string
        push offset string+4
        push HANDL
        call _imp__WriteConsoleA@20;we derive a string of characters
add ebx,10
pop ecx
loop @b

a12:    push 0
        push offset LENS
        push 200
        push offset string
        push HANDL1
        call _imp__ReadConsoleA@20;waiting to enter a string of characters
push 0
call _imp__ExitProcess@4
;===================================================
Eprst proc uses edi esi ebx lpReal10:dword,lpDest:dword
local iExp:dword
local x[3]:dword
local temp1:dword
local temp2:dword
fninit
        mov ecx,lpReal10
fld tbyte ptr [ecx]
mov edi,lpDest
mov ebx,[ecx]
add edi,4
mov eax,[ecx+4]
mov [x],ebx
movzx edx,word ptr [ecx+8]
mov [x+4],eax
mov [x+8],edx
cmp edx,8000h
mov byte ptr [edi],'-'
sbb esi,esi
and esi,0Dh
sub [edi],esi
and edx,7FFFh
jnz a2
Zero_Or_Denormal: cmp edx,eax
jnz Denormal
        cmp ebx,eax
jnz Denormal
mov dword ptr [edi+1],'oreZ'
mov word ptr  [edi+5],0A0Dh
mov dword ptr [edi-4],7
        ret
a2: cmp edx,7FFFh
jz Infinity_Or_SNAN_Or_QNAN_Or_Uncertainty
Denormal:mov esi,10
sub edx,16383
mov word ptr [edi+21],'+E'
imul edx,magic1
mov word ptr [edi+27],0A0Dh
and edx,0FFFF0000h
mov dword ptr [edi-4],29
sar edx,14
mov iExp,edx
jz @f
cmp edx,4*$max
jg a1
cmp edx,-4*$max
jge load
;------------------------------------------------
dec edx
a1: not edx
sar edx,2
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
load: fld tabs[edx+edx*2]
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]
shift4::test eax,60000000h
jz a6
fld tabs[12]
fmul
add iExp,4
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
shift3::shld edx,eax,3
shld eax,ebx,3
shl ebx,3
add ebx,9;10
jmp shift0
shift2::shld edx,eax,2
shld eax,ebx,2
shl ebx,2
add ebx,8
jmp shift0
shift1::shld edx,eax,1
shld eax,ebx,1
shl ebx,1
add ebx,4
shift0::adc eax,0
adc edx,0
mov [edi+1],dl
mov byte ptr [edi+2],','
or byte ptr [edi+1],'0'
k=3
rept 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
mov edx,eax
sar eax,2
sar edx,31
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 ax,word ptr table0[edx*2] ;edx = quotient of the division by 100
mov word ptr [edi+23],ax
lea eax,[edx*4]
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 ax,word ptr table0[esi*2]
        mov word ptr [edi+25],ax
ret
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
        mov dword ptr [edi+1],'ifnI'
        mov dword ptr [edi+5],'ytin'
        mov word ptr  [edi+9],0A0Dh
mov dword ptr [edi-4],11
ret
SNAN_Or_QNAN_Or_Uncertainty:
test eax,eax
jns error
test eax,40000000h
jnz QNAN
        mov dword ptr [edi+1],'ngiS'
        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],0D726562h;'reb'
        mov dword ptr [edi+21],0Ah
mov dword ptr [edi-4],22
ret
QNAN: test eax,3FFFFFFFh
jnz @f
test ebx,ebx
jnz @f
        mov dword ptr [edi+1],'ecnU'
        mov dword ptr [edi+5],'iatr'
        mov dword ptr [edi+9],0D79746Eh;'ytn'
        mov byte ptr [edi+13],0Ah
mov dword ptr [edi-4],14
ret
@@: mov dword ptr [edi+1],'eiuQ'
        mov dword ptr [edi+5],'oN t'
        mov dword ptr [edi+9],' a n'
        mov dword ptr [edi+13],'bmuN'
        mov dword ptr [edi+17],0A0D7265h;'re'
mov dword ptr [edi-4],21
ret
error: mov dword ptr [edi+1],'orrE'
        mov dword ptr [edi+5],0A0D72h;'r'
mov dword ptr [edi-4],8
ret
Eprst endp
end start
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 14, 2013, 12:20:54 AM
Mikl___,
             Now it assembles and it works but it doesnt end
             i dont know why, but no problems.
             I read your code. Now the question is this: if i try to use
             your Eprst to convert only one real10 number it doesnt do
             it correctly, it shows only rubbish. So, please write your
             code in such a way that we may do this, for instance
              (and post it) :

            fldpi
            fstp    tbyte ptr _Real10_R
            invoke  Eprst, addr _Real10_R, addr _RclBuf
            print   addr _RclBuf, 13, 10           
            inkey " *** STOP - Eprst --- E N D ---*** "

             
         
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 14, 2013, 12:41:46 AM
Olá, RuiLoureiro!
Claro, eu vou fazer isso amanhã...
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 14, 2013, 01:30:09 AM
Quote from: Mikl__ on May 14, 2013, 12:41:46 AM
Olá, RuiLoureiro!
Claro, eu vou fazer isso amanhã...
:biggrin:
              Olá Mikl__ !
               See what i wrote about magic numbers.
:icon14:
Rui
Title: Re: Converting a Real10 to string
Post by: qWord on May 14, 2013, 01:53:33 AM
Quote from: RuiLoureiro on May 14, 2013, 12:20:54 AMif i try to use
             your Eprst to convert only one real10 number it doesnt do
             it correctly, it shows only rubbish
It somehow work for some numbers after I've cleaned up the code a bit:
include \masm32\include\masm32rt.inc
.686
.mmx
.xmm

    EPRST struct
        cc DWORD ?
        string BYTE 32 dup (?) ; ends with CR,LF
    EPRST ends

    Eprst proto lpReal10:ptr REAL10,lpDest:ptr EPRST

.const
    foo REAL10 3.14159265358979323846264
    ;foo REAL10 3.14159265358979323846264E61 ; crash --> requires: $max >= 61
.code
main proc
LOCAL result:EPRST
   
    invoke Eprst,OFFSET foo,ADDR result
    mov eax,result.cc
    mov result.string[eax],0
    print ADDR result.string
   
    inkey
    exit
   
main endp



    $max equ 60; <-- This number may be increased
    magic1 equ 4D10h;lg(2)*65536=19728,3...
    magic2  equ 35269h;log2(10)*65536=3,32192809488736234780*65536=217705,8796265381788254208..
.const
    cntr = -$max
    REPEAT 2*$max+1
        IF cntr NE 0
            REAL10 @CatStr(<1.0e>,%-cntr)
        ELSE
            tabs REAL10 1.0
        ENDIF
        WORD 0
        cntr = cntr + 1
    ENDM

    table0 db "000102030405060708091011121314151617181920212223242526272829"
            db "303132333435363738394041424344454647484950515253545556575859"
            db "606162636465666768697071727374757677787980818283848586878889"
            db "90919293949596979899"
   
    table1 dd shift0,shift1,shift2,shift3,shift4
.code
Eprst proc uses edi esi ebx lpReal10:ptr REAL10,lpDest:ptr EPRST
local iExp:dword
local x[3]:dword
local temp1:dword
local temp2:dword
    fninit
        mov ecx,lpReal10
    fld tbyte ptr [ecx]
    mov edi,lpDest
    mov ebx,[ecx]
    add edi,4
    mov eax,[ecx+4]
    mov [x],ebx
    movzx edx,word ptr [ecx+8]
    mov [x+4],eax
    mov [x+8],edx
    cmp edx,8000h
    mov byte ptr [edi],'-'
    sbb esi,esi
    and esi,0Dh
    sub [edi],esi
    and edx,7FFFh
    jnz a2
Zero_Or_Denormal: cmp edx,eax
    jnz Denormal
        cmp ebx,eax
    jnz Denormal
    mov dword ptr [edi+1],'oreZ'
    mov word ptr  [edi+5],0A0Dh
    mov dword ptr [edi-4],7
        ret
a2: cmp edx,7FFFh
    jz Infinity_Or_SNAN_Or_QNAN_Or_Uncertainty
Denormal:mov esi,10
    sub edx,16383
    mov word ptr [edi+21],'+E'
    imul edx,magic1
    mov word ptr [edi+27],0A0Dh
    and edx,0FFFF0000h
    mov dword ptr [edi-4],29
    sar edx,14
    mov iExp,edx
    jz @f
    cmp edx,4*$max
    jg a1
    cmp edx,-4*$max
    jge load
;------------------------------------------------
    dec edx
a1: not edx
    sar edx,2
    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
load: fld tabs[edx+edx*2]
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
    jmp table1[ecx*4]
shift4::test eax,60000000h
    jz a6
    fld tabs[12]
    fmul
    add iExp,4
    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
shift3::shld edx,eax,3
    shld eax,ebx,3
    shl ebx,3
    add ebx,9;10
    jmp shift0
shift2::shld edx,eax,2
    shld eax,ebx,2
    shl ebx,2
    add ebx,8
    jmp shift0
shift1::shld edx,eax,1
    shld eax,ebx,1
    shl ebx,1
    add ebx,4
shift0::adc eax,0
    adc edx,0
    mov [edi+1],dl
    mov byte ptr [edi+2],','
    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
    mov edx,eax
    sar eax,2
    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 ax,word ptr table0[edx*2] ;edx = quotient of the division by 100
    mov word ptr [edi+23],ax
    lea eax,[edx*4]
    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 ax,word ptr table0[esi*2]
        mov word ptr [edi+25],ax
    ret
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
        mov dword ptr [edi+1],'ifnI'
        mov dword ptr [edi+5],'ytin'
        mov word ptr  [edi+9],0A0Dh
    mov dword ptr [edi-4],11
    ret
SNAN_Or_QNAN_Or_Uncertainty:
    test eax,eax
    jns error
    test eax,40000000h
    jnz QNAN
        mov dword ptr [edi+1],'ngiS'
        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],0D726562h;'reb'
        mov dword ptr [edi+21],0Ah
    mov dword ptr [edi-4],22
    ret
QNAN: test eax,3FFFFFFFh
    jnz @f
    test ebx,ebx
    jnz @f
        mov dword ptr [edi+1],'ecnU'
        mov dword ptr [edi+5],'iatr'
        mov dword ptr [edi+9],0D79746Eh;'ytn'
        mov byte ptr [edi+13],0Ah
    mov dword ptr [edi-4],14
    ret
@@: mov dword ptr [edi+1],'eiuQ'
        mov dword ptr [edi+5],'oN t'
        mov dword ptr [edi+9],' a n'
        mov dword ptr [edi+13],'bmuN'
        mov dword ptr [edi+17],0A0D7265h;'re'
    mov dword ptr [edi-4],21
    ret
error: mov dword ptr [edi+1],'orrE'
        mov dword ptr [edi+5],0A0D72h;'r'
    mov dword ptr [edi-4],8
    ret
Eprst endp
end main


BTW: the errors for the hexadecimal FP values comes up through an bug in MASM - it is fixed for newer versions (or jWasm)
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 14, 2013, 03:31:57 AM
qWord,
       now i understood what he did

Quote
.data
                dd 0
_RclBuf      db 40 dup (0)
_real10_R  dt 1.2345678901234567E+500

.code
        mov      esi, offset _Rclbuffer           
        invoke   Eprst, OFFSET _real10_R, esi
        mov      eax, [esi]       
        mov      byte ptr [esi+4+eax], 0
        add      esi, 4
        print    esi

        In this case the program crashes
        and it doesnt give the correct results
        in other cases

Mikl__,
       we need the user's manual  ;)
       you need to say something about how to
       use it.

        . all my converters works with null
          terminated strings;
         
        . the address of the the first byte is
          the address of the buffer.

      So if we do
.data
                dd 0
_StringBuffer   db 40 dup (0)

      we only need to do

            invoke  ConvertXXX, addr _real10_R, addr _StringBuffer
            print   addr _StringBuffer

       If we want to know the length we do this:

            mov     ecx, [_StringBuffer-4]   
Title: Re: Converting a Real10 to string
Post by: qWord on May 14, 2013, 04:30:53 AM
Quote from: RuiLoureiro on May 14, 2013, 03:31:57 AMIf we want to know the length we do this:

            mov     ecx, [_StringBuffer-4]
... which is a very unusual solution  :eusa_snooty:
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 14, 2013, 04:38:30 AM
Quote from: qWord on May 14, 2013, 04:30:53 AM
Quote from: RuiLoureiro on May 14, 2013, 03:31:57 AMIf we want to know the length we do this:

            mov     ecx, [_StringBuffer-4]
... which is a very unusual solution  :eusa_snooty:
I know this since i am here, in this forum,
               ask MichaelW (and Paul i think) what i said to him in those days !
               It´s a very old story.

               In TASM we have the values of each member,
               in MASM not.

               My solution is the address is the address not
               1 byte forward like PASCAL, for instance.
               more: if the length is 20 we have 0 in
                         [_StringBuffer+20]
              Unusual is also variables _x, _exit, _all...kind ...
              but i have not problems with names _eax, _esp
              _print, etc. all names. The assembler doesnt stop
              because we are using a reserved word.
Title: Re: Converting a Real10 to string
Post by: dedndave on May 14, 2013, 05:14:21 AM
if you look at my EvalReal function, i use a buffer that has 4 extra bytes at the beginning
i process numbers at Buffer+4
then, when i want to add a sign and a decimal point, i have room to work   :P
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 14, 2013, 05:58:34 AM
Quote from: dedndave on May 14, 2013, 05:14:21 AM
if you look at my EvalReal function, i use a buffer that has 4 extra bytes at the beginning
i process numbers at Buffer+4
then, when i want to add a sign and a decimal point, i have room to work   :P
yes, it is usual. Unusual is to put behind, but in this case
               we dont need to change the starting address. We may work with
               indexes.
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 14, 2013, 06:03:10 AM
Mikl__,

About accuracy
------------------

Suppose we have the number

            X=1.2345678912 3456 * 10^3

and my converter shows this:

        X=1.2345678012 * 10^3

It has only 7 correct digits

Now, suppose we did a lot of operations
and at the end we have this number:

            X=1.23456789123456 * 10^3

May i say the last digit 5 is correct ?
or
May i say the last digit 6 is correct ?
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 14, 2013, 11:44:01 AM
qWord,
Great Thanks for the correction of errors in my programm!!!
RuiLoureiro,
I think that corrected other mistakes; masm windows console #
include \masm32\include\masm32rt.inc
.686
.mmx
.xmm

    Eprst proto lpReal10:ptr REAL10,lpDest:DWORD

.data
    _Real10_R REAL10 3.141592653589793238462E61; no crash
.code
main proc
LOCAL result[32]:BYTE

;    fldpi
;    fstp _Real10_R
    invoke Eprst,addr _Real10_R,ADDR result
    print ADDR result,13,10
   
    inkey " *** STOP - Eprst --- E N D ---*** "
    exit
   
main endp



    $max equ 60; <-- This number may be increased
    magic1 equ 4D10h;lg(2)*65536=19728,3...
    magic2  equ 35269h;log2(10)*65536=3,32192809488736234780*65536=217705,8796265381788254208..
.const
    cntr = -$max
    REPEAT 2*$max+1
        IF cntr NE 0
            REAL10 @CatStr(<1.0e>,%-cntr)
        ELSE
            tabs REAL10 1.0
        ENDIF
        WORD 0
        cntr = cntr + 1
    ENDM

    table0   label word
n=0
rept 100
dw (n mod 10 shl 8)+(n/10)+"00"
n=n+1
endm   
   
    table1 dd shift0,shift1,shift2,shift3,shift4
.code
Eprst proc uses edi esi ebx lpReal10:ptr REAL10,lpDest:DWORD
local iExp:dword
local x[3]:dword
local temp1:dword
local temp2:dword
    fninit
        mov ecx,lpReal10
    fld tbyte ptr [ecx]
    mov edi,lpDest
    mov ebx,[ecx]
    mov eax,[ecx+4]
    mov [x],ebx
    movzx edx,word ptr [ecx+8]
    mov [x+4],eax
    mov [x+8],edx
    cmp edx,8000h
    mov byte ptr [edi],'-'
    sbb esi,esi
    and esi,0Dh
    sub [edi],esi
    and edx,7FFFh
    jnz a2
Zero_Or_Denormal: cmp edx,eax
    jnz Denormal
        cmp ebx,eax
    jnz Denormal
    mov dword ptr [edi+1],'oreZ'
    mov dword ptr [edi+5],0
        ret
a2: cmp edx,7FFFh
    jz Infinity_Or_SNAN_Or_QNAN_Or_Uncertainty
Denormal:mov esi,10
    sub edx,16383
    mov word ptr [edi+21],'+E'
    imul edx,magic1
    and edx,0FFFF0000h
    sar edx,14
    mov iExp,edx
    jz @f
    cmp edx,4*$max
    jg a1
    cmp edx,-4*$max
    jge load
;------------------------------------------------
    dec edx
a1:neg edx
    sar edx,2
    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
load: fld tabs[edx+edx*2]
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]
shift4::test eax,60000000h
    jz a6
    fld tabs[12]
    fmul
    add iExp,4
    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
shift3::shld edx,eax,3
    shld eax,ebx,3
    shl ebx,3
    add ebx,9;10
    jmp shift0
shift2::shld edx,eax,2
    shld eax,ebx,2
    shl ebx,2
    add ebx,8
    jmp shift0
shift1::shld edx,eax,1
    shld eax,ebx,1
    shl ebx,1
    add ebx,4
shift0::adc eax,0
    adc edx,0
    mov [edi+1],dl
    mov byte ptr [edi+2],','
    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
    mov edx,eax
    sar eax,2
    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*2] ;edx = quotient of the division by 100
    mov dword ptr [edi+23],eax
    lea eax,[edx*4]
    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*2]
    mov dword ptr [edi+25],eax
    mov dword ptr [edi+27],0
    ret
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
        mov dword ptr [edi+1],'ifnI'
        mov dword ptr [edi+5],'ytin'
        mov dword ptr [edi+9],0
    ret
SNAN_Or_QNAN_Or_Uncertainty:
    test eax,eax
    jns error
    test eax,40000000h
    jnz QNAN
        mov dword ptr [edi+1],'ngiS'
        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'
    ret
QNAN: test eax,3FFFFFFFh
    jnz @f
    test ebx,ebx
    jnz @f
        mov dword ptr [edi+1],'ecnU'
        mov dword ptr [edi+5],'iatr'
        mov dword ptr [edi+9],'ytn'
    ret
@@: mov dword ptr [edi+1],'eiuQ'
        mov dword ptr [edi+5],'oN t'
        mov dword ptr [edi+9],' a n'
        mov dword ptr [edi+13],'bmuN'
        mov dword ptr [edi+17],'re'
    ret
error: mov dword ptr [edi+1],'orrE'
        mov dword ptr [edi+5],'r'
    ret
Eprst endp
end main
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 14, 2013, 09:25:47 PM
Hi Mikl__
          This is my first test using your Eprst procedure
          (in the second i got 1964)
          The first 7 results is only to test if procs
          are working correctly (but i have a single test
          procedure to each procedure)
          I will study your proc  :t
See the test file below. Test yourself and show us
the results
note: direct MN = 64bits Magic Number converter
Quote
3,141592653589793238E+0000   <---- Eprst
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
*** STOP - Converting PI ***

1399 cycles, ConvertFloat10ZX, _Real10_2

3296 cycles, ConvertFloat10, _Real10_2

1400 cycles, ConvertFloat10Z, _Real10_2

1780 cycles, ConvertFloat10DF, _Real10_2

1653 cycles, ConvertFloat10DR, _Real10_2

1054 cycles, ConvertFloat10BX, _Real10_2

1042 cycles, ConvertFloat10BF, _Real10_2

1038 cycles, ConvertFloat10BY, _Real10_2

1728 cycles, ConvertFloat10DY, _Real10_2

1702 cycles, ConvertFloat10DX, _Real10_2

1061 cycles, ConvertFloat10CT, _Real10_2

1772 cycles, ConvertFloat10DS, _Real10_2

3270 cycles, ConvertFloat10BW, _Real10_2

4045 cycles, ConvertFloat10DW, _Real10_2

1534 cycles, ConvertFloat10MR, _Real10_2

1794 cycles, ConvertFloat10DFD, _Real10_2

1697 cycles, ConvertFloat10DRD, _Real10_2

1059 cycles, ConvertFloat10BXD, _Real10_2

1057 cycles, ConvertFloat10BFD, _Real10_2

1052 cycles, ConvertFloat10BYD, _Real10_2

1850 cycles, ConvertFloat10DYD, _Real10_2

1755 cycles, ConvertFloat10DXD, _Real10_2

1078 cycles, ConvertFloat10CTD, _Real10_2

1772 cycles, ConvertFloat10DSD, _Real10_2

3378 cycles, ConvertFloat10BWD, _Real10_2

3942 cycles, ConvertFloat10DWD, _Real10_2

1775 cycles, ConvertReal10DF, _Real10_2

1656 cycles, ConvertReal10DR, _Real10_2

1061 cycles, ConvertReal10BX, _Real10_2

1041 cycles, ConvertReal10BF, _Real10_2

1041 cycles, ConvertReal10BY, _Real10_2

1724 cycles, ConvertReal10DY, _Real10_2

1699 cycles, ConvertReal10DX, _Real10_2

1075 cycles, ConvertReal10CT, _Real10_2

1768 cycles, ConvertReal10DS, _Real10_2

3271 cycles, ConvertReal10BW, _Real10_2

4041 cycles, ConvertReal10DW, _Real10_2

1807 cycles, ConvertReal10DFD, _Real10_2

1690 cycles, ConvertReal10DRD, _Real10_2

1066 cycles, ConvertReal10BXD, _Real10_2

1048 cycles, ConvertReal10BFD, _Real10_2

1053 cycles, ConvertReal10BYD, _Real10_2

1772 cycles, ConvertReal10DYD, _Real10_2

1762 cycles, ConvertReal10DXD, _Real10_2

1080 cycles, ConvertReal10CTD, _Real10_2

1810 cycles, ConvertReal10DSD, _Real10_2

4113 cycles, ConvertReal10BWD, _Real10_2

4461 cycles, ConvertReal10DWD, _Real10_2

1961 cycles, Eprst, _Real10_2                 <---- Eprst

*** Press any key to get the time table ***

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

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

1038  cycles, ConvertFloat10BY, BCD, examine, fxtract, esp - 18 digits
1041  cycles, ConvertReal10BF, BCD, fxam, fxtract, esp - 18 digits
1041  cycles, ConvertReal10BY, BCD, examine, fxtract, esp - 18 digits
1042  cycles, ConvertFloat10BF, BCD, fxam, fxtract, esp - 18 digits
1048  cycles, ConvertReal10BFD, BCD, fxam, fxtract, esp - 18 digits
1052  cycles, ConvertFloat10BYD, BCD, examine, fxtract, esp - 18 digits
1053  cycles, ConvertReal10BYD, BCD, examine, fxtract, esp - 18 digits
1054  cycles, ConvertFloat10BX, BCD, fxam, fxtract, ebp - 18 digits
1057  cycles, ConvertFloat10BFD, BCD, fxam, fxtract, esp - 18 digits
1059  cycles, ConvertFloat10BXD, BCD, fxam, fxtract, ebp - 18 digits
1061  cycles, ConvertFloat10CT, BCD-CT, fxam, fxtract, esp - 18 digits
1061  cycles, ConvertReal10BX, BCD, fxam, fxtract, ebp - 18 digits
1066  cycles, ConvertReal10BXD, BCD, fxam, fxtract, ebp - 18 digits
1075  cycles, ConvertReal10CT, BCD-CT, fxam, fxtract, esp - 18 digits
1078  cycles, ConvertFloat10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
1080  cycles, ConvertReal10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
1399  cycles, ConvertFloat10ZX, BCD - old - 18 digits
1400  cycles, ConvertFloat10Z, BCD -old - 18 digits
1534  cycles, ConvertFloat10MR, direct MN, examine, fxtract, ebp - 18 digits
1653  cycles, ConvertFloat10DR, direct, examine, fxtract, ebp - 18 digits
1656  cycles, ConvertReal10DR, direct, examine, fxtract, ebp - 18 digits
1690  cycles, ConvertReal10DRD, direct, examine, fxtract, ebp - 18 digits
1697  cycles, ConvertFloat10DRD, direct, examine, fxtract, ebp - 18 digits
1699  cycles, ConvertReal10DX, direct, fxam, fxtract, esp - 18 digits
1702  cycles, ConvertFloat10DX, direct, fxam, fxtract, esp - 18 digits
1724  cycles, ConvertReal10DY, direct, examine, fxtract, esp - 18 digits
1728  cycles, ConvertFloat10DY, direct, examine, fxtract, esp - 18 digits
1755  cycles, ConvertFloat10DXD, direct, fxam, fxtract, esp - 18 digits
1762  cycles, ConvertReal10DXD, direct, fxam, fxtract, esp - 18 digits
1768  cycles, ConvertReal10DS, direct, fxam, fyl2x, ebp - 18 digits
1772  cycles, ConvertFloat10DSD, direct, fxam, fyl2x, ebp - 18 digits
1772  cycles, ConvertReal10DYD, direct, examine, fxtract, esp - 18 digits
1772  cycles, ConvertFloat10DS, direct, fxam, fyl2x, ebp - 18 digits
1775  cycles, ConvertReal10DF, direct, examine, fyl2x, ebp - 18 digits
1780  cycles, ConvertFloat10DF, direct, examine, fyl2x, ebp - 18 digits
1794  cycles, ConvertFloat10DFD, direct, examine, fyl2x, ebp - 18 digits
1807  cycles, ConvertReal10DFD, direct, examine, fyl2x, ebp - 18 digits
1810  cycles, ConvertReal10DSD, direct, fxam, fyl2x, ebp - 18 digits
1850  cycles, ConvertFloat10DYD, direct, examine, fxtract, esp - 18 digits
1961  cycles, Eprst, -18 digits
3270  cycles, ConvertFloat10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3271  cycles, ConvertReal10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3296  cycles, ConvertFloat10, BCD, Save FPU -old - 18 digits
3378  cycles, ConvertFloat10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3942  cycles, ConvertFloat10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
4041  cycles, ConvertReal10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
4045  cycles, ConvertFloat10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
4113  cycles, ConvertReal10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
4461  cycles, ConvertReal10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
********** END **********

All procedures use _Real10_2 for test

Quote
;-------- for timing -------------
_Real10_2      dt -1234.5678E+234

            ...

         START_COUNTER_CYCLE_HIGH_PRIORITY_CLASS
         invoke  ConvertReal10DWD, addr _Real10_2, 0, $DECIMALPLACES_REAL10
         SAVE_COUNTER_CYCLE < cycles, ConvertReal10DWD, _Real10_2 >

         START_COUNTER_CYCLE_HIGH_PRIORITY_CLASS
         invoke Eprst,addr _Real10_2, addr _RclBuf
         SAVE_COUNTER_CYCLE < cycles, Eprst, _Real10_2 >
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 15, 2013, 02:16:34 AM
Now for 19 digits - (no BCD)

_Real10_R = -12345678.12345678

we have:
note 1: Float uses length; Real only null terminated string

note 2: your converter shows only in scientific format
        and all my converters in 3 formats: integer, decimal, scientific
   
Quote
-1,234567812345678000E+0007
-12345678.12345678
-12345678.12345678
-12345678.12345678
-12345678.12345678
-12345678.12345678
-12345678.12345678
-12345678.12345678
*** STOP - Converting - 19 digits ***

1623 cycles, ConvertFloat10DF, _Real10_R

1481 cycles, ConvertFloat10DR, _Real10_R

1492 cycles, ConvertFloat10DY, _Real10_R

1484 cycles, ConvertFloat10DX, _Real10_R

1630 cycles, ConvertFloat10DS, _Real10_R

3919 cycles, ConvertFloat10DW, _Real10_R

1304 cycles, ConvertFloat10MR, _Real10_R

1609 cycles, ConvertFloat10DFD, _Real10_R

1481 cycles, ConvertFloat10DRD, _Real10_R

1606 cycles, ConvertFloat10DYD, _Real10_R

1591 cycles, ConvertFloat10DXD, _Real10_R

1622 cycles, ConvertFloat10DSD, _Real10_R

3819 cycles, ConvertFloat10DWD, _Real10_R

1596 cycles, ConvertReal10DF, _Real10_R

1486 cycles, ConvertReal10DR, _Real10_R

1499 cycles, ConvertReal10DY, _Real10_R

1478 cycles, ConvertReal10DX, _Real10_R

1644 cycles, ConvertReal10DS, _Real10_R

3930 cycles, ConvertReal10DW, _Real10_R

1601 cycles, ConvertReal10DFD, _Real10_R

1481 cycles, ConvertReal10DRD, _Real10_R

1553 cycles, ConvertReal10DYD, _Real10_R

1560 cycles, ConvertReal10DXD, _Real10_R

1642 cycles, ConvertReal10DSD, _Real10_R

3808 cycles, ConvertReal10DWD, _Real10_R

1780 cycles, Eprst, _Real10_R

*** Press any key to get the time table ***

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

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

1304  cycles, ConvertFloat10MR, direct MN, examine, fxtract, ebp - 19 digits
1478  cycles, ConvertReal10DX, direct, fxam, fxtract, esp - 19 digits
1481  cycles, ConvertFloat10DRD, direct, examine, fxtract, ebp - 19 digits
1481  cycles, ConvertReal10DRD, direct, examine, fxtract, ebp - 19 digits
1481  cycles, ConvertFloat10DR, direct, examine, fxtract, ebp - 19 digits
1484  cycles, ConvertFloat10DX, direct, fxam, fxtract, esp - 19 digits
1486  cycles, ConvertReal10DR, direct, examine, fxtract, ebp - 19 digits
1492  cycles, ConvertFloat10DY, direct, examine, fxtract, esp - 19 digits
1499  cycles, ConvertReal10DY, direct, examine, fxtract, esp - 19 digits
1553  cycles, ConvertReal10DYD, direct, examine, fxtract, esp - 19 digits
1560  cycles, ConvertReal10DXD, direct, fxam, fxtract, esp - 19 digits
1591  cycles, ConvertFloat10DXD, direct, fxam, fxtract, esp - 19 digits
1596  cycles, ConvertReal10DF, direct, examine, fyl2x, ebp - 19 digits
1601  cycles, ConvertReal10DFD, direct, examine, fyl2x, ebp - 19 digits
1606  cycles, ConvertFloat10DYD, direct, examine, fxtract, esp - 19 digits
1609  cycles, ConvertFloat10DFD, direct, examine, fyl2x, ebp - 19 digits
1622  cycles, ConvertFloat10DSD, direct, fxam, fyl2x, ebp - 19 digits
1623  cycles, ConvertFloat10DF, direct, examine, fyl2x, ebp - 19 digits
1630  cycles, ConvertFloat10DS, direct, fxam, fyl2x, ebp - 19 digits
1642  cycles, ConvertReal10DSD, direct, fxam, fyl2x, ebp - 19 digits
1644  cycles, ConvertReal10DS, direct, fxam, fyl2x, ebp - 19 digits
1780  cycles, Eprst, -19 digits
3808  cycles, ConvertReal10DWD, direct,Save FPU, fxam, fxtract, esp -19 digits
3819  cycles, ConvertFloat10DWD, direct,Save FPU, fxam, fxtract, esp -19 digits
3919  cycles, ConvertFloat10DW, direct,Save FPU, fxam, fxtract, esp -19 digits
3930  cycles, ConvertReal10DW, direct,Save FPU, fxam, fxtract, esp -19 digits
********** END **********
Title: Re: Converting a Real10 to string
Post by: jj2007 on May 15, 2013, 02:31:51 AM
Quote from: RuiLoureiro on May 15, 2013, 02:16:34 AM
Now for 19 digits - (no BCD)

_Real10_R = -12345678.12345678

That is 16 digits - a bit more is possible:
include \masm32\MasmBasic\MasmBasic.inc        ; download (http://masm32.com/board/index.php?topic=94.0)
        Init
        fld FP10(123456789.123456789123)
        Inkey Str$("Result=%Jf", ST(0))
        Exit
end start

Result=123456789.1234567891
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 15, 2013, 02:45:22 AM
Quote from: jj2007 on May 15, 2013, 02:31:51 AM
Quote from: RuiLoureiro on May 15, 2013, 02:16:34 AM
Now for 19 digits - (no BCD)

_Real10_R = -12345678.12345678

That is 16 digits - a bit more is possible:
But you need to understand first what it means
             unless you want to say that all numbers have 19 digits (to show)!   :P

Quote
Suppose we have the number

            X=1.2345678912 3456 * 10^3

If we want dp=10 decimal places, it means that we need to
move the decimal point 10 places right (btw 2 and 3).

To get the integer with dp+1 digits we need to remove
the factor 10^3

            Y= X * 10^-3    (exponent removed, Y=1.2345678912 3456)

Now to get the integer we need to multiply by 10^dp

            Z= Y * 10^dp = X * 10^-3 * 10^dp
           
             = X* 10^(dp-exponent)   (exponent = 3)

Now, calling
                expsacale= dp-exponent

we need to do this:

                Z = X * 10^expscale

If dp=10 than
                Z= 12345678912 . 3456

Now, if this number is inside st(0) we do

        fistp    qword ptr _QwordVar

and we get
            _QwordVar = 12345678912   (and we know exponent=+3)


So, to convert to string we do this

            _string ="1.2345678912" plus "e+3"

and we show the number with 10 decimal places.
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 15, 2013, 04:01:38 AM
Mikl__,
           Some data you need to see

Quote
;            From Eprst we get this:
;
; 3,141592653589793238E+0000
;0000_80000000_00000000 = 3,36210314311209 2086E-4932
;0000_FFFFFFFF_FFFFFFFF = 6,72420628622418 4172E-4932

;0000_00000000_00000001 = 0,840525785778023021E-4932   <--- ??? x
;0000_FFFFFFFF_FFFFFFFF = 3,362103143112092086E-4932   <--- ??? y
;7FFF_80000000_00000000 = Infinity
;FFFF_80000000_00000000 =-Infinity
;7FFE_FFFFFFFF_FFFFFFFF = 1,18973149535723176 4E+4932
;FFFE_FFFFFFFF_FFFFFFFF =-1,18973149535723176 4E+4932
; *** STOP - Eprst  end test digits ***
;
; from DAVE evaluator prog:
;
;0000_80000000_00000000: +3.36210314311209 350626e-4932 (p)
;0000_FFFFFFFF_FFFFFFFF: +6.72420628622418 701216e-4932 (p)

;0000_00000000_00000001: +3.64519953188247460253e-4951 (d)  <--- x
;0000_FFFFFFFF_FFFFFFFF: +6.72420628622418701216e-4932 (p)  <--- y
;7FFF_80000000_00000000: +8
;FFFF_80000000_00000000: -8
;7FFE_FFFFFFFF_FFFFFFFF: +1.18973149535723176 502e+4932
;FFFE_FFFFFFFF_FFFFFFFF: -1.18973149535723176 502e+4932
;
; From BX
; -------
;0000_80000000_00000000 = 3.36210314311209 35e-4932
;0000_FFFFFFFF_FFFFFFFF = 6.72420628622418 70e-4932
;7FFE_FFFFFFFF_FFFFFFFF = 1.18973149535723177e+4932
;FFFE_FFFFFFFF_FFFFFFFF =-1.18973149535723177e+4932
; *** STOP - ConvertFloat10BX  end test digits ***
Title: Re: Converting a Real10 to string
Post by: dedndave on May 15, 2013, 04:38:50 AM
hi Rui   :biggrin:

to make the infinity symbol (lemniscate), hold the Alt key, then 236 on the 10-key pad, then release the Alt key
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 15, 2013, 05:01:39 AM
hi dave,
             ok, give me your keyboard, please   ( ý <- Alt+236  :P )

Mikl,
This is your prog.
See it.

What do you do if exponent > 4932 ?
i get 10^4933 = infinity.

Quote
local temp1:dword
local temp2:dword

    fninit
    mov ecx,lpReal10
    fld tbyte ptr [ecx]
    mov edi,lpDest
    mov ebx,[ecx]
    mov eax,[ecx+4]
    mov
  • ,ebx
        movzx edx,word ptr [ecx+8]
        mov [x+4],eax
        mov [x+8],edx
        cmp edx,8000h                  <---- ???
        mov byte ptr [edi],'-'
        sbb esi,esi
        and esi,0Dh
        sub [edi],esi
        and edx,7FFFh
        jnz a2
       
    Zero_Or_Denormal: cmp edx,eax
                      jnz Denormal
                      cmp ebx,eax
                      jnz Denormal
                      mov dword ptr [edi+1],'oreZ'
                      mov dword ptr [edi+5],0
                      ret

                a2:   cmp edx,7FFFh
                      jz Infinity_Or_SNAN_Or_QNAN_Or_Uncertainty
       
    Denormal:   mov     esi,10              ; <----- is Denormal or Normal ?   
                sub     edx,16383
                mov     word ptr [edi+21],'+E'
                imul    edx,magic1
                and     edx,0FFFF0000h
                sar     edx,14
                mov     iExp,edx
                jz      @f
                cmp     edx,4*$max
                jg      a1
                cmp     edx,-4*$max
                jge     load
    ;------------------------------------------------
                dec edx
            a1: neg edx
                sar edx,2
                mov temp1,edx
                imul edx,magic2
                sar edx,16
                mov temp2,edx
                fild temp2
                fild temp1
                fldl2t
                fmul
                fsub st,st(1)
                f2xm1
                fld
                fadd       
                fscale
                fstp    st(1)
                jmp     multiply
               
        load:   fld     tabs[edx+edx*2]
       
       multiply:fmul
                fld     st
                fstp    tbyte ptr x    ; --- a new real10 number again ---
Title: Re: Converting a Real10 to string
Post by: dedndave on May 15, 2013, 10:41:35 AM
maybe i should use +Infinity and -Infinity, rather than the lemniscate char   :(
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 15, 2013, 12:39:16 PM
mov ecx,lpReal10
    fld tbyte ptr [ecx] <-- load in FPU REAL10
    mov ebx,[ecx] <-- in EBX 0-31 bits
    mov eax,[ecx+4] <-- in EAX 32-63 bits   
    movzx edx,word ptr [ecx+8] <-- in EDX 79-64 bits and 95-80 bits are zeros
    cmp edx,8000h    <---- compare number is negatve or positive
    mov byte ptr [edi],'-' <-- ASCII-code "minus"=2Dh
    sbb esi,esi <-- if number is negatve ESI=0 if nubmer is positive ESI=FFFFFFFF
    and esi,0Dh <-- if number is negatve ESI=0 if nubmer is positive ESI=0Dh
    sub [edi],esi <-- if number is negatve [EDI]=2Dh="-" if nubmer is positive [EDI]=2D-0D=20h=" "
    and edx,7FFFh <-- equal fabs REAL10
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 15, 2013, 03:55:15 PM
Quote; from DAVE evaluator prog:
;7FFF_80000000_00000000: +8 +∞ ?
;FFFF_80000000_00000000: -8
from IEEE754
Encodings of ±2k+1-N n into Binary Fields :
|Number Type| Sign Bit| K+1 bit Exponent| Nth bit |N-1 bits of Significand
|Infinities: |binary 111...111 |1| 0
and from Intel® 64 and IA-32 Architectures Software Developer's Manual
Volume 1: Basic Architecture
Table 8-3. Unsupported Double Extended-Precision Floating-Point Encodings and
Pseudo-Denormals
|Class|Sign|Biased Exponent|Integer|Fraction
|Positive Pseudo-infinity|0|11..11|0|00..00
|Negative Pseudo-infinity|1|11..11|0|00..00
|||← 15 bits →||← 63 bits →
Numerical Computation Guide. November 2005
Table 3-12 IEEE Values: Double Exterded Precision (x86)

|Common Name|Bit Patern (x86 Architecture)|Value
|+∞|7FFF 80000000 00000000|+∞
|-∞|FFFF 80000000 00000000|-∞
|min positive subnormal|0000 00000000 00000001|1.82259976594123730126E-4951
|max positive normal |7FFE FFFFFFFF FFFFFFFF |1.18973149535723176505e+4932
|min positive normal |0001 80000000 00000000 |3.36210314311209350626e−4932
|max positive subnormal |0000 7FFFFFFF FFFFFFFF |3.36210314311209350608e−4932
|quiet NaN with greatest fraction| 7FFF FFFFFFFF FFFFFFFF |QNaN
|quiet NaN with least fraction| 7FFF C0000000 00000000 |QNaN
|signaling NaN with greatest fraction| 7FFF BFFFFFFF FFFFFFFF |SNaN
|signaling NaN with least fraction| 7FFF 80000000 00000001 |SNaN
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 15, 2013, 05:35:22 PM
Hi, dedndave!
Quotefrom DAVE evaluator prog:
About what kind of program said RuiLoureiro?

2.99GHz 3.49Gb RAM Pentium 4 (Eprst.zip)
465 MHz, 256 Mb RAM Celeron (02.zip)
Title: Re: Converting a Real10 to string
Post by: dedndave on May 15, 2013, 08:19:47 PM
you can download it here (Evr1.zip)

http://masm32.com/board/index.php?topic=222.0 (http://masm32.com/board/index.php?topic=222.0)

C:\Masm32\Asm32\EvalReal => evr
Evr: Ling Long Kai Fang Real Number Evaluation Utility
DednDave  5-2013  Ver 1.0

  This program evaluates hexadecimal Intel real numbers from the command line.
     The characters 0-9, A-F, P, X, and S are read, all others are ignored.
  This allows the use of spaces, underscores, etc, to separate the hex digits.
If the number of hex digits doesn't total 8, 16, or 20, this message is shown.
           The P switch may be used to show values at full Precision.
   The X switch may be used to show values with 3 eXtra digits of precision.
                      The X switch overrides the P switch.
      The S switch may be used to Step the LSB, showing 3 adjacent values.
               (d) = Denormal               (p) = Pseudo-Denormal

                    Example: Evr 4000 C90F DAA2 2168 C235 xs
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 16, 2013, 01:20:44 PM
dedndave,
Thank you very much! :t
Title: Re: Converting a Real10 to string
Post by: dedndave on May 16, 2013, 01:44:49 PM
you bet, Mikl

have a look at this post
http://masm32.com/board/index.php?topic=1804.msg18923#msg18923 (http://masm32.com/board/index.php?topic=1804.msg18923#msg18923)
it explains that denormals and pseudo-denormals are stored with an exponent that should be adjusted
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 16, 2013, 04:23:47 PM
; masm windows console #
include \masm32\include\masm32rt.inc
.686
.mmx
.xmm
Eprst proto lpReal10:ptr REAL10,lpDest:DWORD
.data
_Real10_R dd 0,0,0  ;0.0
dd 0,0,8000h        ;-0.0
dd 0,80000000h,3FFFh;1.0
dd 0,80000000h,4000h;2.0
dd 0FFFFFFFFh,0FFFFFFFFh,7FFEh;1.18973149535723176505e+4932
dd 0,80000000h,1;3.36210314311209350626e-4932 min pos normal
dd 0FFFFFFFFh,7FFFFFFFh,0;3.36210314311209350608e-4932 max subnormal
dd 1,0,0;3.64519953188247460253e-4951 min pos subnormal
dd 0,80000000h,7FFFh;+Infinity
dd 0,80000000h,0FFFFh;-Infinity
dd 0FFFFFFFFh,0FFFFFFFFh,7FFFh; QNaN
dd 0,0C0000000h,7FFFh; QNaN
dd 0FFFFFFFFh,0BFFFFFFFh,7FFFh; SNaN
dd 1,80000000h,7FFFh; SNaN
max_ten REAL10 1.0e+4931
    $max equ 60; <-- This number may be increased
    magic1 equ 4D10h;lg(2)*65536=19728,3...
    magic2  equ 35269h;log2(10)*65536=3,32192809488736234780*65536=217705,8796265381788254208..
.const
    cntr = -$max
    REPEAT 2*$max+1
        IF cntr NE 0
            REAL10 @CatStr(<1.0e>,%-cntr)
        ELSE
            tabs REAL10 1.0
        ENDIF
        WORD 0
        cntr = cntr + 1
    ENDM

    table0  label word
n=0
rept 100
dw (n mod 10 shl 8)+(n/10)+"00"
n=n+1
endm   
    table1 dd shift0,shift1,shift2,shift3,shift4
.code
main proc
LOCAL result[32]:BYTE

mov ecx,14
mov ebx,offset _Real10_R
@@: push ecx
invoke Eprst,ebx,ADDR result
print ADDR result,13,10
add ebx,12
pop ecx
loop @b
    inkey " *** STOP - Eprst --- E N D ---*** "
    exit
   
main endp
Eprst proc uses edi esi ebx lpReal10: ptr REAL10,lpDest:DWORD
local iExp:dword
local aExp:dword
local x[3]:dword
local temp1:dword
local temp2:dword
fninit
        mov ecx,lpReal10
fld tbyte ptr [ecx]
mov edi,lpDest
mov ebx,[ecx]
mov aExp,0
mov eax,[ecx+4]
mov [x],ebx
movzx edx,word ptr [ecx+8]
mov [x+4],eax
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
Zero_Or_Denormal_or_Normal: cmp edx,eax
jnz Denormal_or_Normal
        cmp ebx,eax
jnz Denormal_or_Normal
mov dword ptr [edi+1],'oreZ'
mov dword ptr [edi+5],0
        ret
Denormal_or_Normal: test eax,80000000h
jnz _Normal
Denormal:fld max_ten  ;st(0)=1.0e+4931
mov aExp,-4931*4
fmul                  ;normalization
fld st
fstp tbyte ptr x
mov ebx,x
mov eax,x+4
mov edx,x+8
jmp _Normal
a2: cmp edx,7FFFh
jz Infinity_Or_SNAN_Or_QNAN_Or_Uncertainty
_Normal:mov esi,10
sub edx,16383
mov word ptr [edi+21],'+E'
imul edx,magic1
and edx,0FFFF0000h
sar edx,14
mov iExp,edx
jz @f
cmp edx,4*$max
jg a1
cmp edx,-4*$max
jge load
;------------------------------------------------
dec edx
a1: neg edx;
sar edx,2
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
load: fld tabs[edx+edx*2]
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]
shift4::test eax,60000000h
jz a6
fld tabs[12]
fmul
add iExp,4
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
shift3::shld edx,eax,3
shld eax,ebx,3
shl ebx,3
add ebx,9;10
jmp shift0
shift2::shld edx,eax,2
shld eax,ebx,2
shl ebx,2
add ebx,8
jmp shift0
shift1::shld edx,eax,1
shld eax,ebx,1
shl ebx,1
add ebx,4
shift0::adc eax,0
adc edx,0
mov [edi+1],dl
mov byte ptr [edi+2],','
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,2
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*2] ;edx = quotient of the division by 100
mov dword ptr [edi+23],eax
lea eax,[edx*4]
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*2]
mov dword ptr [edi+25],eax
mov dword ptr [edi+27],0
ret
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
        mov dword ptr [edi+1],'ifnI'
        mov dword ptr [edi+5],'ytin'
        mov dword ptr [edi+9],0
ret
SNAN_Or_QNAN_Or_Uncertainty:
test eax,eax
jns error
test eax,40000000h
jnz QNAN
        mov dword ptr [edi+1],'ngiS'
        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'
ret
QNAN: test eax,3FFFFFFFh
jnz @f
test ebx,ebx
jnz @f
        mov dword ptr [edi+1],'ecnU'
        mov dword ptr [edi+5],'iatr'
        mov dword ptr [edi+9],'ytn'
ret
@@: mov dword ptr [edi+1],'eiuQ'
        mov dword ptr [edi+5],'oN t'
        mov dword ptr [edi+9],' a n'
        mov dword ptr [edi+13],'bmuN'
        mov dword ptr [edi+17],'re'
ret
error: mov dword ptr [edi+1],'orrE'
        mov dword ptr [edi+5],'r'
ret
Eprst endp
end main

datavalueEprst
dd 0,0,0h+0.0 Zero
dd 0,0,8000h-0.0-Zero
dd 0,80000000h,3FFFh1.0 1,000000000000000000E+0000
dd 0,80000000h,4000h2.0 2,000000000000000000E+0000
dd 0FFFFFFFFh,0FFFFFFFFh,7FFEh1.18973149535723176505e+49321,189731495357231764E+4932
dd 0,80000000h,13.36210314311209350626e-4932
min positive normal
3,362103143112092086E-4932
dd 0FFFFFFFFh,7FFFFFFFh,03.36210314311209350608e-4932
max subnormal
3,362103143112093506E-4932
dd 1,0,03.64519953188247460253e-4951
min positive subnormal
3,645199531882474602E-4951
dd 0,80000000h,7FFFh+Infinity Infinity
dd 0,80000000h,0FFFFh-Infinity-Infinity
dd 0FFFFFFFFh,0FFFFFFFFh,7FFFhQNaNQuiet Non a Number
dd 0,0C0000000h,7FFFh QNaN Uncertainty
dd 0FFFFFFFFh,0BFFFFFFFh,7FFFh SNaN Signal Non a Number
dd 1,80000000h,7FFFh SNaN Signal Non a Number
Title: Re: Converting a Real10 to string
Post by: jj2007 on May 17, 2013, 03:47:35 AM
Reply #18:
3,141592653589793238E+0000
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
*** STOP - Converting PI ***
697 cycles, ConvertFloat10ZX, _Real10_2

1161 cycles, ConvertFloat10, _Real10_2

692 cycles, ConvertFloat10Z, _Real10_2

1002 cycles, ConvertFloat10DF, _Real10_2

928 cycles, ConvertFloat10DR, _Real10_2

565 cycles, ConvertFloat10BX, _Real10_2

561 cycles, ConvertFloat10BF, _Real10_2

561 cycles, ConvertFloat10BY, _Real10_2

943 cycles, ConvertFloat10DY, _Real10_2

938 cycles, ConvertFloat10DX, _Real10_2

513 cycles, ConvertFloat10CT, _Real10_2

990 cycles, ConvertFloat10DS, _Real10_2

852 cycles, ConvertFloat10BW, _Real10_2

1222 cycles, ConvertFloat10DW, _Real10_2

738 cycles, ConvertFloat10MR, _Real10_2

999 cycles, ConvertFloat10DFD, _Real10_2

920 cycles, ConvertFloat10DRD, _Real10_2

569 cycles, ConvertFloat10BXD, _Real10_2

560 cycles, ConvertFloat10BFD, _Real10_2

560 cycles, ConvertFloat10BYD, _Real10_2

933 cycles, ConvertFloat10DYD, _Real10_2

929 cycles, ConvertFloat10DXD, _Real10_2

518 cycles, ConvertFloat10CTD, _Real10_2

993 cycles, ConvertFloat10DSD, _Real10_2

853 cycles, ConvertFloat10BWD, _Real10_2

1199 cycles, ConvertFloat10DWD, _Real10_2

993 cycles, ConvertReal10DF, _Real10_2

919 cycles, ConvertReal10DR, _Real10_2

564 cycles, ConvertReal10BX, _Real10_2

563 cycles, ConvertReal10BF, _Real10_2

563 cycles, ConvertReal10BY, _Real10_2

934 cycles, ConvertReal10DY, _Real10_2

935 cycles, ConvertReal10DX, _Real10_2

511 cycles, ConvertReal10CT, _Real10_2

1011 cycles, ConvertReal10DS, _Real10_2

843 cycles, ConvertReal10BW, _Real10_2

1226 cycles, ConvertReal10DW, _Real10_2

1006 cycles, ConvertReal10DFD, _Real10_2

920 cycles, ConvertReal10DRD, _Real10_2

559 cycles, ConvertReal10BXD, _Real10_2

561 cycles, ConvertReal10BFD, _Real10_2

561 cycles, ConvertReal10BYD, _Real10_2

946 cycles, ConvertReal10DYD, _Real10_2

935 cycles, ConvertReal10DXD, _Real10_2

511 cycles, ConvertReal10CTD, _Real10_2

1006 cycles, ConvertReal10DSD, _Real10_2

854 cycles, ConvertReal10BWD, _Real10_2

1218 cycles, ConvertReal10DWD, _Real10_2

458 cycles, Eprst, _Real10_2

*** Press any key to get the time table ***

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

Intel(R) Celeron(R) M CPU        420  @ 1.60GHz (SSE3)

458  cycles, Eprst, -18 digits
511  cycles, ConvertReal10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
511  cycles, ConvertReal10CT, BCD-CT, fxam, fxtract, esp - 18 digits
513  cycles, ConvertFloat10CT, BCD-CT, fxam, fxtract, esp - 18 digits
518  cycles, ConvertFloat10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
559  cycles, ConvertReal10BXD, BCD, fxam, fxtract, ebp - 18 digits
560  cycles, ConvertFloat10BFD, BCD, fxam, fxtract, esp - 18 digits
560  cycles, ConvertFloat10BYD, BCD, examine, fxtract, esp - 18 digits
561  cycles, ConvertReal10BYD, BCD, examine, fxtract, esp - 18 digits
561  cycles, ConvertReal10BFD, BCD, fxam, fxtract, esp - 18 digits
561  cycles, ConvertFloat10BY, BCD, examine, fxtract, esp - 18 digits
561  cycles, ConvertFloat10BF, BCD, fxam, fxtract, esp - 18 digits
563  cycles, ConvertReal10BY, BCD, examine, fxtract, esp - 18 digits
563  cycles, ConvertReal10BF, BCD, fxam, fxtract, esp - 18 digits
564  cycles, ConvertReal10BX, BCD, fxam, fxtract, ebp - 18 digits
565  cycles, ConvertFloat10BX, BCD, fxam, fxtract, ebp - 18 digits
569  cycles, ConvertFloat10BXD, BCD, fxam, fxtract, ebp - 18 digits
692  cycles, ConvertFloat10Z, BCD -old - 18 digits
697  cycles, ConvertFloat10ZX, BCD - old - 18 digits
738  cycles, ConvertFloat10MR, direct MN, examine, fxtract, ebp - 18 digits
843  cycles, ConvertReal10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
852  cycles, ConvertFloat10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
853  cycles, ConvertFloat10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
854  cycles, ConvertReal10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
919  cycles, ConvertReal10DR, direct, examine, fxtract, ebp - 18 digits
920  cycles, ConvertReal10DRD, direct, examine, fxtract, ebp - 18 digits
920  cycles, ConvertFloat10DRD, direct, examine, fxtract, ebp - 18 digits
928  cycles, ConvertFloat10DR, direct, examine, fxtract, ebp - 18 digits
929  cycles, ConvertFloat10DXD, direct, fxam, fxtract, esp - 18 digits
933  cycles, ConvertFloat10DYD, direct, examine, fxtract, esp - 18 digits
934  cycles, ConvertReal10DY, direct, examine, fxtract, esp - 18 digits
935  cycles, ConvertReal10DXD, direct, fxam, fxtract, esp - 18 digits
935  cycles, ConvertReal10DX, direct, fxam, fxtract, esp - 18 digits
938  cycles, ConvertFloat10DX, direct, fxam, fxtract, esp - 18 digits
943  cycles, ConvertFloat10DY, direct, examine, fxtract, esp - 18 digits
946  cycles, ConvertReal10DYD, direct, examine, fxtract, esp - 18 digits
990  cycles, ConvertFloat10DS, direct, fxam, fyl2x, ebp - 18 digits
993  cycles, ConvertFloat10DSD, direct, fxam, fyl2x, ebp - 18 digits
993  cycles, ConvertReal10DF, direct, examine, fyl2x, ebp - 18 digits
999  cycles, ConvertFloat10DFD, direct, examine, fyl2x, ebp - 18 digits
1002  cycles, ConvertFloat10DF, direct, examine, fyl2x, ebp - 18 digits
1006  cycles, ConvertReal10DSD, direct, fxam, fyl2x, ebp - 18 digits
1006  cycles, ConvertReal10DFD, direct, examine, fyl2x, ebp - 18 digits
1011  cycles, ConvertReal10DS, direct, fxam, fyl2x, ebp - 18 digits
1161  cycles, ConvertFloat10, BCD, Save FPU -old - 18 digits
1199  cycles, ConvertFloat10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
1218  cycles, ConvertReal10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
1222  cycles, ConvertFloat10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
1226  cycles, ConvertReal10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
********** END **********
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 17, 2013, 04:24:42 AM
Quote from: Mikl__ on May 15, 2013, 05:35:22 PM
Hi, dedndave!
Quotefrom DAVE evaluator prog:
About what kind of program said RuiLoureiro?

2.99GHz 3.49Gb RAM Pentium 4 (Eprst.zip)
465 MHz, 256 Mb RAM Celeron (02.zip)

Mikl,
        Your results seems to be good in some processors
        but very bad in my P4. So the conclusion seems to be
        this: your proc is good to you and my procs are good to me.

        Meanwhile there is a difference (significant ?).
        Your proc uses only the scientific format, so it prints
        1.000000000000000000E+0000 instead of 1.0.
        Well, it is an option. If i had time, i will modify one
        of them to compare with your proc in your system.
        I hope that you develop and improve it. It was good if
        you explained something about it.
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 17, 2013, 06:39:32 AM
Hi all,
       Could you run TestCycles10_18D.asm in your
       system if it is not a P4, please ?
       Thanks

Mikl,
       Could you test this ?

note: to test, i am using some macros written by MichaelW
          that you can find in MASM

My results       
Quote
*** Press any key to get the time table ***

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

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

772  cycles, ConvertFloat10BF, BCD, fxam, fxtract, esp - 18 digits
775  cycles, ConvertFloat10BY, BCD, examine, fxtract, esp - 18 digits
780  cycles, ConvertReal10BF, BCD, fxam, fxtract, esp - 18 digits
784  cycles, ConvertReal10BY, BCD, examine, fxtract, esp - 18 digits
784  cycles, ConvertFloat10BFD, BCD, fxam, fxtract, esp - 18 digits
785  cycles, ConvertFloat10BYD, BCD, examine, fxtract, esp - 18 digits
786  cycles, ConvertFloat10BX, BCD, fxam, fxtract, ebp - 18 digits
798  cycles, ConvertFloat10CT, BCD-CT, fxam, fxtract, esp - 18 digits
801  cycles, ConvertReal10BYD, BCD, examine, fxtract, esp - 18 digits
801  cycles, ConvertReal10BFD, BCD, fxam, fxtract, esp - 18 digits
803  cycles, ConvertReal10CT, BCD-CT, fxam, fxtract, esp - 18 digits
804  cycles, ConvertReal10BX, BCD, fxam, fxtract, ebp - 18 digits
810  cycles, ConvertFloat10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
812  cycles, ConvertReal10BXD, BCD, fxam, fxtract, ebp - 18 digits
813  cycles, ConvertReal10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
825  cycles, ConvertFloat10BXD, BCD, fxam, fxtract, ebp - 18 digits
963  cycles, ConvertReal10CTT, BCD-CTT, fxam, extract, esp - 18 digits
1158  cycles, ConvertFloat10ZX, BCD - old - 18 digits
1185  cycles, ConvertFloat10Z, BCD -old - 18 digits
1268  cycles, ConvertFloat10MR, direct MN, examine, fxtract, ebp - 18 digits
1389  cycles, ConvertFloat10DY, direct, examine, fxtract, esp - 18 digits
1393  cycles, ConvertReal10DY, direct, examine, fxtract, esp - 18 digits
1394  cycles, ConvertReal10DX, direct, fxam, fxtract, esp - 18 digits
1394  cycles, ConvertFloat10DR, direct, examine, fxtract, ebp - 18 digits
1400  cycles, ConvertReal10DR, direct, examine, fxtract, ebp - 18 digits
1401  cycles, ConvertFloat10DRD, direct, examine, fxtract, ebp - 18 digits
1409  cycles, ConvertFloat10DX, direct, fxam, fxtract, esp - 18 digits
1425  cycles, ConvertReal10DRD, direct, examine, fxtract, ebp - 18 digits
1458  cycles, ConvertFloat10DXD, direct, fxam, fxtract, esp - 18 digits
1463  cycles, ConvertFloat10DYD, direct, examine, fxtract, esp - 18 digits
1474  cycles, ConvertReal10DXD, direct, fxam, fxtract, esp - 18 digits
1499  cycles, ConvertReal10DYD, direct, examine, fxtract, esp - 18 digits
1516  cycles, ConvertReal10DF, direct, examine, fyl2x, ebp - 18 digits
1517  cycles, ConvertFloat10DF, direct, examine, fyl2x, ebp - 18 digits
1527  cycles, ConvertFloat10DSD, direct, fxam, fyl2x, ebp - 18 digits
1529  cycles, ConvertFloat10DFD, direct, examine, fyl2x, ebp - 18 digits
1530  cycles, ConvertFloat10DS, direct, fxam, fyl2x, ebp - 18 digits
1554  cycles, ConvertReal10DFD, direct, examine, fyl2x, ebp - 18 digits
1561  cycles, ConvertReal10DSD, direct, fxam, fyl2x, ebp - 18 digits
1779  cycles, Eprst, -18 digits
2002  cycles, ConvertReal10DS, direct, fxam, fyl2x, ebp - 18 digits
3086  cycles, ConvertFloat10, BCD, Save FPU -old - 18 digits
3112  cycles, ConvertFloat10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3160  cycles, ConvertFloat10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3196  cycles, ConvertReal10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3647  cycles, ConvertReal10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3716  cycles, ConvertFloat10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
3719  cycles, ConvertReal10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
3821  cycles, ConvertFloat10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
4118  cycles, ConvertReal10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
********** END **********
Title: Re: Converting a Real10 to string
Post by: Gunther on May 17, 2013, 07:01:13 AM
Hi RuiLoureiro

here are the results (not a P4):

3,141592653589793238E+0000
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
-123456789.56789
*** STOP - Converting PI ***
568 cycles, ConvertFloat10ZX, _Real10_2

936 cycles, ConvertFloat10, _Real10_2

513 cycles, ConvertFloat10Z, _Real10_2

458 cycles, ConvertFloat10DF, _Real10_2

407 cycles, ConvertFloat10DR, _Real10_2

351 cycles, ConvertFloat10BX, _Real10_2

367 cycles, ConvertFloat10BF, _Real10_2

370 cycles, ConvertFloat10BY, _Real10_2

406 cycles, ConvertFloat10DY, _Real10_2

403 cycles, ConvertFloat10DX, _Real10_2

357 cycles, ConvertFloat10CT, _Real10_2

457 cycles, ConvertFloat10DS, _Real10_2

654 cycles, ConvertFloat10BW, _Real10_2

825 cycles, ConvertFloat10DW, _Real10_2

375 cycles, ConvertFloat10MR, _Real10_2

459 cycles, ConvertFloat10DFD, _Real10_2

407 cycles, ConvertFloat10DRD, _Real10_2

366 cycles, ConvertFloat10BXD, _Real10_2

359 cycles, ConvertFloat10BFD, _Real10_2

358 cycles, ConvertFloat10BYD, _Real10_2

405 cycles, ConvertFloat10DYD, _Real10_2

405 cycles, ConvertFloat10DXD, _Real10_2

371 cycles, ConvertFloat10CTD, _Real10_2

463 cycles, ConvertFloat10DSD, _Real10_2

665 cycles, ConvertFloat10BWD, _Real10_2

816 cycles, ConvertFloat10DWD, _Real10_2

462 cycles, ConvertReal10DF, _Real10_2

403 cycles, ConvertReal10DR, _Real10_2

373 cycles, ConvertReal10BX, _Real10_2

366 cycles, ConvertReal10BF, _Real10_2

365 cycles, ConvertReal10BY, _Real10_2

404 cycles, ConvertReal10DY, _Real10_2

405 cycles, ConvertReal10DX, _Real10_2

362 cycles, ConvertReal10CT, _Real10_2

352 cycles, ConvertReal10CTT, _Real10_2

456 cycles, ConvertReal10DS, _Real10_2

645 cycles, ConvertReal10BW, _Real10_2

823 cycles, ConvertReal10DW, _Real10_2

461 cycles, ConvertReal10DFD, _Real10_2

407 cycles, ConvertReal10DRD, _Real10_2

369 cycles, ConvertReal10BXD, _Real10_2

361 cycles, ConvertReal10BFD, _Real10_2

363 cycles, ConvertReal10BYD, _Real10_2

410 cycles, ConvertReal10DYD, _Real10_2

407 cycles, ConvertReal10DXD, _Real10_2

360 cycles, ConvertReal10CTD, _Real10_2

460 cycles, ConvertReal10DSD, _Real10_2

669 cycles, ConvertReal10BWD, _Real10_2

820 cycles, ConvertReal10DWD, _Real10_2

236 cycles, Eprst, _Real10_2

*** Press any key to get the time table ***

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

Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz (SSE4)

236  cycles, Eprst, -18 digits
351  cycles, ConvertFloat10BX, BCD, fxam, fxtract, ebp - 18 digits
352  cycles, ConvertReal10CTT, BCD-CTT, fxam, extract, esp - 18 digits
357  cycles, ConvertFloat10CT, BCD-CT, fxam, fxtract, esp - 18 digits
358  cycles, ConvertFloat10BYD, BCD, examine, fxtract, esp - 18 digits
359  cycles, ConvertFloat10BFD, BCD, fxam, fxtract, esp - 18 digits
360  cycles, ConvertReal10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
361  cycles, ConvertReal10BFD, BCD, fxam, fxtract, esp - 18 digits
362  cycles, ConvertReal10CT, BCD-CT, fxam, fxtract, esp - 18 digits
363  cycles, ConvertReal10BYD, BCD, examine, fxtract, esp - 18 digits
365  cycles, ConvertReal10BY, BCD, examine, fxtract, esp - 18 digits
366  cycles, ConvertReal10BF, BCD, fxam, fxtract, esp - 18 digits
366  cycles, ConvertFloat10BXD, BCD, fxam, fxtract, ebp - 18 digits
367  cycles, ConvertFloat10BF, BCD, fxam, fxtract, esp - 18 digits
369  cycles, ConvertReal10BXD, BCD, fxam, fxtract, ebp - 18 digits
370  cycles, ConvertFloat10BY, BCD, examine, fxtract, esp - 18 digits
371  cycles, ConvertFloat10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
373  cycles, ConvertReal10BX, BCD, fxam, fxtract, ebp - 18 digits
375  cycles, ConvertFloat10MR, direct MN, examine, fxtract, ebp - 18 digits
403  cycles, ConvertFloat10DX, direct, fxam, fxtract, esp - 18 digits
403  cycles, ConvertReal10DR, direct, examine, fxtract, ebp - 18 digits
404  cycles, ConvertReal10DY, direct, examine, fxtract, esp - 18 digits
405  cycles, ConvertReal10DX, direct, fxam, fxtract, esp - 18 digits
405  cycles, ConvertFloat10DXD, direct, fxam, fxtract, esp - 18 digits
405  cycles, ConvertFloat10DYD, direct, examine, fxtract, esp - 18 digits
406  cycles, ConvertFloat10DY, direct, examine, fxtract, esp - 18 digits
407  cycles, ConvertReal10DRD, direct, examine, fxtract, ebp - 18 digits
407  cycles, ConvertFloat10DRD, direct, examine, fxtract, ebp - 18 digits
407  cycles, ConvertReal10DXD, direct, fxam, fxtract, esp - 18 digits
407  cycles, ConvertFloat10DR, direct, examine, fxtract, ebp - 18 digits
410  cycles, ConvertReal10DYD, direct, examine, fxtract, esp - 18 digits
456  cycles, ConvertReal10DS, direct, fxam, fyl2x, ebp - 18 digits
457  cycles, ConvertFloat10DS, direct, fxam, fyl2x, ebp - 18 digits
458  cycles, ConvertFloat10DF, direct, examine, fyl2x, ebp - 18 digits
459  cycles, ConvertFloat10DFD, direct, examine, fyl2x, ebp - 18 digits
460  cycles, ConvertReal10DSD, direct, fxam, fyl2x, ebp - 18 digits
461  cycles, ConvertReal10DFD, direct, examine, fyl2x, ebp - 18 digits
462  cycles, ConvertReal10DF, direct, examine, fyl2x, ebp - 18 digits
463  cycles, ConvertFloat10DSD, direct, fxam, fyl2x, ebp - 18 digits
513  cycles, ConvertFloat10Z, BCD -old - 18 digits
568  cycles, ConvertFloat10ZX, BCD - old - 18 digits
645  cycles, ConvertReal10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
654  cycles, ConvertFloat10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
665  cycles, ConvertFloat10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
669  cycles, ConvertReal10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
816  cycles, ConvertFloat10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
820  cycles, ConvertReal10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
823  cycles, ConvertReal10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
825  cycles, ConvertFloat10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
936  cycles, ConvertFloat10, BCD, Save FPU -old - 18 digits
********** END **********


Gunther
Title: Re: Converting a Real10 to string
Post by: jj2007 on May 17, 2013, 07:04:12 AM
Celeron M:
3,141592653589793238E+0000
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
-123456789.56789
*** STOP - Converting PI ***
632 cycles, ConvertFloat10ZX, _Real10_2

1079 cycles, ConvertFloat10, _Real10_2

633 cycles, ConvertFloat10Z, _Real10_2

851 cycles, ConvertFloat10DF, _Real10_2

791 cycles, ConvertFloat10DR, _Real10_2

425 cycles, ConvertFloat10BX, _Real10_2

411 cycles, ConvertFloat10BF, _Real10_2

411 cycles, ConvertFloat10BY, _Real10_2

795 cycles, ConvertFloat10DY, _Real10_2

783 cycles, ConvertFloat10DX, _Real10_2

374 cycles, ConvertFloat10CT, _Real10_2

849 cycles, ConvertFloat10DS, _Real10_2

715 cycles, ConvertFloat10BW, _Real10_2

1085 cycles, ConvertFloat10DW, _Real10_2

596 cycles, ConvertFloat10MR, _Real10_2

849 cycles, ConvertFloat10DFD, _Real10_2

772 cycles, ConvertFloat10DRD, _Real10_2

439 cycles, ConvertFloat10BXD, _Real10_2

432 cycles, ConvertFloat10BFD, _Real10_2

431 cycles, ConvertFloat10BYD, _Real10_2

787 cycles, ConvertFloat10DYD, _Real10_2

785 cycles, ConvertFloat10DXD, _Real10_2

389 cycles, ConvertFloat10CTD, _Real10_2

864 cycles, ConvertFloat10DSD, _Real10_2

706 cycles, ConvertFloat10BWD, _Real10_2

1078 cycles, ConvertFloat10DWD, _Real10_2

844 cycles, ConvertReal10DF, _Real10_2

771 cycles, ConvertReal10DR, _Real10_2

419 cycles, ConvertReal10BX, _Real10_2

429 cycles, ConvertReal10BF, _Real10_2

430 cycles, ConvertReal10BY, _Real10_2

785 cycles, ConvertReal10DY, _Real10_2

785 cycles, ConvertReal10DX, _Real10_2

376 cycles, ConvertReal10CT, _Real10_2

350 cycles, ConvertReal10CTT, _Real10_2

874 cycles, ConvertReal10DS, _Real10_2

694 cycles, ConvertReal10BW, _Real10_2

1086 cycles, ConvertReal10DW, _Real10_2

851 cycles, ConvertReal10DFD, _Real10_2

790 cycles, ConvertReal10DRD, _Real10_2

431 cycles, ConvertReal10BXD, _Real10_2

430 cycles, ConvertReal10BFD, _Real10_2

431 cycles, ConvertReal10BYD, _Real10_2

784 cycles, ConvertReal10DYD, _Real10_2

784 cycles, ConvertReal10DXD, _Real10_2

374 cycles, ConvertReal10CTD, _Real10_2

850 cycles, ConvertReal10DSD, _Real10_2

716 cycles, ConvertReal10BWD, _Real10_2

1086 cycles, ConvertReal10DWD, _Real10_2

362 cycles, Eprst, _Real10_2

*** Press any key to get the time table ***

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

Intel(R) Celeron(R) M CPU        420  @ 1.60GHz (SSE3)

350  cycles, ConvertReal10CTT, BCD-CTT, fxam, extract, esp - 18 digits
362  cycles, Eprst, -18 digits
374  cycles, ConvertReal10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
374  cycles, ConvertFloat10CT, BCD-CT, fxam, fxtract, esp - 18 digits
376  cycles, ConvertReal10CT, BCD-CT, fxam, fxtract, esp - 18 digits
389  cycles, ConvertFloat10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
411  cycles, ConvertFloat10BY, BCD, examine, fxtract, esp - 18 digits
411  cycles, ConvertFloat10BF, BCD, fxam, fxtract, esp - 18 digits
419  cycles, ConvertReal10BX, BCD, fxam, fxtract, ebp - 18 digits
425  cycles, ConvertFloat10BX, BCD, fxam, fxtract, ebp - 18 digits
429  cycles, ConvertReal10BF, BCD, fxam, fxtract, esp - 18 digits
430  cycles, ConvertReal10BY, BCD, examine, fxtract, esp - 18 digits
430  cycles, ConvertReal10BFD, BCD, fxam, fxtract, esp - 18 digits
431  cycles, ConvertReal10BXD, BCD, fxam, fxtract, ebp - 18 digits
431  cycles, ConvertFloat10BYD, BCD, examine, fxtract, esp - 18 digits
431  cycles, ConvertReal10BYD, BCD, examine, fxtract, esp - 18 digits
432  cycles, ConvertFloat10BFD, BCD, fxam, fxtract, esp - 18 digits
439  cycles, ConvertFloat10BXD, BCD, fxam, fxtract, ebp - 18 digits
596  cycles, ConvertFloat10MR, direct MN, examine, fxtract, ebp - 18 digits
632  cycles, ConvertFloat10ZX, BCD - old - 18 digits
633  cycles, ConvertFloat10Z, BCD -old - 18 digits
694  cycles, ConvertReal10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
706  cycles, ConvertFloat10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
715  cycles, ConvertFloat10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
716  cycles, ConvertReal10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
771  cycles, ConvertReal10DR, direct, examine, fxtract, ebp - 18 digits
772  cycles, ConvertFloat10DRD, direct, examine, fxtract, ebp - 18 digits
783  cycles, ConvertFloat10DX, direct, fxam, fxtract, esp - 18 digits
784  cycles, ConvertReal10DYD, direct, examine, fxtract, esp - 18 digits
784  cycles, ConvertReal10DXD, direct, fxam, fxtract, esp - 18 digits
785  cycles, ConvertReal10DY, direct, examine, fxtract, esp - 18 digits
785  cycles, ConvertFloat10DXD, direct, fxam, fxtract, esp - 18 digits
785  cycles, ConvertReal10DX, direct, fxam, fxtract, esp - 18 digits
787  cycles, ConvertFloat10DYD, direct, examine, fxtract, esp - 18 digits
790  cycles, ConvertReal10DRD, direct, examine, fxtract, ebp - 18 digits
791  cycles, ConvertFloat10DR, direct, examine, fxtract, ebp - 18 digits
795  cycles, ConvertFloat10DY, direct, examine, fxtract, esp - 18 digits
844  cycles, ConvertReal10DF, direct, examine, fyl2x, ebp - 18 digits
849  cycles, ConvertFloat10DS, direct, fxam, fyl2x, ebp - 18 digits
849  cycles, ConvertFloat10DFD, direct, examine, fyl2x, ebp - 18 digits
850  cycles, ConvertReal10DSD, direct, fxam, fyl2x, ebp - 18 digits
851  cycles, ConvertReal10DFD, direct, examine, fyl2x, ebp - 18 digits
851  cycles, ConvertFloat10DF, direct, examine, fyl2x, ebp - 18 digits
864  cycles, ConvertFloat10DSD, direct, fxam, fyl2x, ebp - 18 digits
874  cycles, ConvertReal10DS, direct, fxam, fyl2x, ebp - 18 digits
1078  cycles, ConvertFloat10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
1079  cycles, ConvertFloat10, BCD, Save FPU -old - 18 digits
1085  cycles, ConvertFloat10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
1086  cycles, ConvertReal10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
1086  cycles, ConvertReal10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 17, 2013, 07:20:41 AM
Thanks Gunther  :t
Thanks Jochen     :t

Another one
                     Could you test this, if you dont mind
                     please (If not a P4 CPU) ?
Quote
*** Press any key to get the time table ***

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

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

746  cycles, ConvertReal10CTE, BCD-CTE,examine, extract, esp - 18 digits
761  cycles, ConvertReal10CTT, BCD-CTT, fxam, extract, esp - 18 digits
770  cycles, ConvertFloat10BY, BCD, examine, fxtract, esp - 18 digits
774  cycles, ConvertFloat10BF, BCD, fxam, fxtract, esp - 18 digits
776  cycles, ConvertReal10BY, BCD, examine, fxtract, esp - 18 digits
786  cycles, ConvertFloat10BYD, BCD, examine, fxtract, esp - 18 digits
790  cycles, ConvertReal10BF, BCD, fxam, fxtract, esp - 18 digits
791  cycles, ConvertReal10BYD, BCD, examine, fxtract, esp - 18 digits
792  cycles, ConvertReal10BFD, BCD, fxam, fxtract, esp - 18 digits
796  cycles, ConvertFloat10BFD, BCD, fxam, fxtract, esp - 18 digits
797  cycles, ConvertReal10BX, BCD, fxam, fxtract, ebp - 18 digits
797  cycles, ConvertFloat10BXD, BCD, fxam, fxtract, ebp - 18 digits
797  cycles, ConvertFloat10BX, BCD, fxam, fxtract, ebp - 18 digits
801  cycles, ConvertReal10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
801  cycles, ConvertFloat10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
805  cycles, ConvertFloat10CT, BCD-CT, fxam, fxtract, esp - 18 digits
809  cycles, ConvertReal10CT, BCD-CT, fxam, fxtract, esp - 18 digits
809  cycles, ConvertReal10BXD, BCD, fxam, fxtract, ebp - 18 digits
1158  cycles, ConvertFloat10ZX, BCD - old - 18 digits
1180  cycles, ConvertFloat10Z, BCD -old - 18 digits
1272  cycles, ConvertFloat10MR, direct MN, examine, fxtract, ebp - 18 digits
1385  cycles, ConvertFloat10DR, direct, examine, fxtract, ebp - 18 digits
1389  cycles, ConvertReal10DX, direct, fxam, fxtract, esp - 18 digits
1392  cycles, ConvertFloat10DY, direct, examine, fxtract, esp - 18 digits
1395  cycles, ConvertFloat10DRD, direct, examine, fxtract, ebp - 18 digits
1398  cycles, ConvertReal10DY, direct, examine, fxtract, esp - 18 digits
1401  cycles, ConvertFloat10DX, direct, fxam, fxtract, esp - 18 digits
1402  cycles, ConvertReal10DR, direct, examine, fxtract, ebp - 18 digits
1406  cycles, ConvertReal10DRD, direct, examine, fxtract, ebp - 18 digits
1460  cycles, ConvertFloat10DXD, direct, fxam, fxtract, esp - 18 digits
1461  cycles, ConvertReal10DYD, direct, examine, fxtract, esp - 18 digits
1461  cycles, ConvertReal10DXD, direct, fxam, fxtract, esp - 18 digits
1466  cycles, ConvertFloat10DYD, direct, examine, fxtract, esp - 18 digits
1511  cycles, ConvertFloat10DF, direct, examine, fyl2x, ebp - 18 digits
1513  cycles, ConvertReal10DF, direct, examine, fyl2x, ebp - 18 digits
1533  cycles, ConvertFloat10DS, direct, fxam, fyl2x, ebp - 18 digits
1539  cycles, ConvertFloat10DFD, direct, examine, fyl2x, ebp - 18 digits
1543  cycles, ConvertFloat10DSD, direct, fxam, fyl2x, ebp - 18 digits
1555  cycles, ConvertReal10DS, direct, fxam, fyl2x, ebp - 18 digits
1559  cycles, ConvertReal10DFD, direct, examine, fyl2x, ebp - 18 digits
1568  cycles, ConvertReal10DSD, direct, fxam, fyl2x, ebp - 18 digits
1763  cycles, Eprst, -18 digits
3055  cycles, ConvertReal10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3063  cycles, ConvertFloat10, BCD, Save FPU -old - 18 digits
3066  cycles, ConvertFloat10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3152  cycles, ConvertReal10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3162  cycles, ConvertFloat10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
3709  cycles, ConvertReal10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
3726  cycles, ConvertFloat10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
3810  cycles, ConvertReal10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
3891  cycles, ConvertFloat10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
********** END **********
Title: Re: Converting a Real10 to string
Post by: Gunther on May 17, 2013, 07:00:35 PM
Hi RuiLoureiro,

here are the results:

3,141592653589793238E+0000
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
3.14159265358979324
*** STOP - Converting PI ***
-123456789.56789
661 cycles, ConvertFloat10ZX, _Real10_2

1079 cycles, ConvertFloat10, _Real10_2

575 cycles, ConvertFloat10Z, _Real10_2

604 cycles, ConvertFloat10DF, _Real10_2

537 cycles, ConvertFloat10DR, _Real10_2

377 cycles, ConvertFloat10BX, _Real10_2

375 cycles, ConvertFloat10BF, _Real10_2

375 cycles, ConvertFloat10BY, _Real10_2

569 cycles, ConvertFloat10DY, _Real10_2

543 cycles, ConvertFloat10DX, _Real10_2

326 cycles, ConvertFloat10CT, _Real10_2

573 cycles, ConvertFloat10DS, _Real10_2

703 cycles, ConvertFloat10BW, _Real10_2

874 cycles, ConvertFloat10DW, _Real10_2

512 cycles, ConvertFloat10MR, _Real10_2

581 cycles, ConvertFloat10DFD, _Real10_2

548 cycles, ConvertFloat10DRD, _Real10_2

407 cycles, ConvertFloat10BXD, _Real10_2

378 cycles, ConvertFloat10BFD, _Real10_2

382 cycles, ConvertFloat10BYD, _Real10_2

533 cycles, ConvertFloat10DYD, _Real10_2

529 cycles, ConvertFloat10DXD, _Real10_2

363 cycles, ConvertFloat10CTD, _Real10_2

595 cycles, ConvertFloat10DSD, _Real10_2

723 cycles, ConvertFloat10BWD, _Real10_2

875 cycles, ConvertFloat10DWD, _Real10_2

607 cycles, ConvertReal10DF, _Real10_2

510 cycles, ConvertReal10DR, _Real10_2

389 cycles, ConvertReal10BX, _Real10_2

389 cycles, ConvertReal10BF, _Real10_2

385 cycles, ConvertReal10BY, _Real10_2

543 cycles, ConvertReal10DY, _Real10_2

546 cycles, ConvertReal10DX, _Real10_2

338 cycles, ConvertReal10CT, _Real10_2

319 cycles, ConvertReal10CTT, _Real10_2

314 cycles, ConvertReal10CTE, _Real10_2

572 cycles, ConvertReal10DS, _Real10_2

692 cycles, ConvertReal10BW, _Real10_2

897 cycles, ConvertReal10DW, _Real10_2

578 cycles, ConvertReal10DFD, _Real10_2

520 cycles, ConvertReal10DRD, _Real10_2

388 cycles, ConvertReal10BXD, _Real10_2

390 cycles, ConvertReal10BFD, _Real10_2

400 cycles, ConvertReal10BYD, _Real10_2

535 cycles, ConvertReal10DYD, _Real10_2

533 cycles, ConvertReal10DXD, _Real10_2

339 cycles, ConvertReal10CTD, _Real10_2

596 cycles, ConvertReal10DSD, _Real10_2

721 cycles, ConvertReal10BWD, _Real10_2

878 cycles, ConvertReal10DWD, _Real10_2

299 cycles, Eprst, _Real10_2

*** Press any key to get the time table ***

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

Pentium(R) Dual-Core  CPU      E5800  @ 3.20GHz (SSE4)

299  cycles, Eprst, -18 digits
314  cycles, ConvertReal10CTE, BCD-CTE,examine, extract, esp - 18 digits
319  cycles, ConvertReal10CTT, BCD-CTT, fxam, extract, esp - 18 digits
326  cycles, ConvertFloat10CT, BCD-CT, fxam, fxtract, esp - 18 digits
338  cycles, ConvertReal10CT, BCD-CT, fxam, fxtract, esp - 18 digits
339  cycles, ConvertReal10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
363  cycles, ConvertFloat10CTD, BCD-CT, fxam, fxtract, esp - 18 digits
375  cycles, ConvertFloat10BY, BCD, examine, fxtract, esp - 18 digits
375  cycles, ConvertFloat10BF, BCD, fxam, fxtract, esp - 18 digits
377  cycles, ConvertFloat10BX, BCD, fxam, fxtract, ebp - 18 digits
378  cycles, ConvertFloat10BFD, BCD, fxam, fxtract, esp - 18 digits
382  cycles, ConvertFloat10BYD, BCD, examine, fxtract, esp - 18 digits
385  cycles, ConvertReal10BY, BCD, examine, fxtract, esp - 18 digits
388  cycles, ConvertReal10BXD, BCD, fxam, fxtract, ebp - 18 digits
389  cycles, ConvertReal10BX, BCD, fxam, fxtract, ebp - 18 digits
389  cycles, ConvertReal10BF, BCD, fxam, fxtract, esp - 18 digits
390  cycles, ConvertReal10BFD, BCD, fxam, fxtract, esp - 18 digits
400  cycles, ConvertReal10BYD, BCD, examine, fxtract, esp - 18 digits
407  cycles, ConvertFloat10BXD, BCD, fxam, fxtract, ebp - 18 digits
510  cycles, ConvertReal10DR, direct, examine, fxtract, ebp - 18 digits
512  cycles, ConvertFloat10MR, direct MN, examine, fxtract, ebp - 18 digits
520  cycles, ConvertReal10DRD, direct, examine, fxtract, ebp - 18 digits
529  cycles, ConvertFloat10DXD, direct, fxam, fxtract, esp - 18 digits
533  cycles, ConvertReal10DXD, direct, fxam, fxtract, esp - 18 digits
533  cycles, ConvertFloat10DYD, direct, examine, fxtract, esp - 18 digits
535  cycles, ConvertReal10DYD, direct, examine, fxtract, esp - 18 digits
537  cycles, ConvertFloat10DR, direct, examine, fxtract, ebp - 18 digits
543  cycles, ConvertReal10DY, direct, examine, fxtract, esp - 18 digits
543  cycles, ConvertFloat10DX, direct, fxam, fxtract, esp - 18 digits
546  cycles, ConvertReal10DX, direct, fxam, fxtract, esp - 18 digits
548  cycles, ConvertFloat10DRD, direct, examine, fxtract, ebp - 18 digits
569  cycles, ConvertFloat10DY, direct, examine, fxtract, esp - 18 digits
572  cycles, ConvertReal10DS, direct, fxam, fyl2x, ebp - 18 digits
573  cycles, ConvertFloat10DS, direct, fxam, fyl2x, ebp - 18 digits
575  cycles, ConvertFloat10Z, BCD -old - 18 digits
578  cycles, ConvertReal10DFD, direct, examine, fyl2x, ebp - 18 digits
581  cycles, ConvertFloat10DFD, direct, examine, fyl2x, ebp - 18 digits
595  cycles, ConvertFloat10DSD, direct, fxam, fyl2x, ebp - 18 digits
596  cycles, ConvertReal10DSD, direct, fxam, fyl2x, ebp - 18 digits
604  cycles, ConvertFloat10DF, direct, examine, fyl2x, ebp - 18 digits
607  cycles, ConvertReal10DF, direct, examine, fyl2x, ebp - 18 digits
661  cycles, ConvertFloat10ZX, BCD - old - 18 digits
692  cycles, ConvertReal10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
703  cycles, ConvertFloat10BW, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
721  cycles, ConvertReal10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
723  cycles, ConvertFloat10BWD, BCD, Save FPU, fxam, fxtract, ebp - 18 digits
874  cycles, ConvertFloat10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
875  cycles, ConvertFloat10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
878  cycles, ConvertReal10DWD, direct,Save FPU, fxam, fxtract, esp -18 digits
897  cycles, ConvertReal10DW, direct,Save FPU, fxam, fxtract, esp -18 digits
1079  cycles, ConvertFloat10, BCD, Save FPU -old - 18 digits
********** END **********

And the other archive:

0
1.0000000000000000e+00
2.0000000000000000e+00
3.0000000000000000e+00
4.0000000000000000e+00
5.0000000000000000e+00
6.0000000000000000e+00
7.0000000000000000e+00
8.0000000000000000e+00
9.0000000000000000e+00
1.00000000000000000e-01
2.0000000000000000e-01
3.0000000000000000e-01
4.0000000000000000e-01
5.0000000000000000e-01
6.0000000000000000e-01
7.0000000000000000e-01
8.0000000000000000e-01
9.0000000000000000e-01
*** STOP - ConvertReal10CTE  end test digits ***
-1.1000000000000000e+00
-1.11000000000000000e+01
-1.11100000000000000e+02
-1.1111000000000000e+03
-1.11111000000000000e+04
-1.11111100000000000e+05
-1.1111111000000000e+06
-1.11111111000000000e+07
-1.11111111100000000e+08
-1.1111111111000000e+09
-1.11111111111000000e+10
-1.11111111111100000e+11
-1.1111111111111000e+12
-1.11111111111111000e+13
-1.11111111111111100e+14
-1.11111111111111110e+15
-1.11111111111111111e+16
-1.11111111111111111e+17
-2.2000000000000000e+00
-2.2200000000000000e+01
-2.2220000000000000e+02
-2.2222000000000000e+03
-2.2222200000000000e+04
-2.2222220000000000e+05
-2.2222222000000000e+06
-2.2222222200000000e+07
-2.2222222220000000e+08
-2.2222222222000000e+09
-2.2222222222200000e+10
-2.2222222222220000e+11
-2.2222222222222000e+12
-2.2222222222222200e+13
-2.2222222222222220e+14
-2.2222222222222222e+15
-2.2222222222222222e+16
-2.2222222222222222e+17
-3.3000000000000000e+00
-3.3300000000000000e+01
-3.3330000000000000e+02
-3.3333000000000000e+03
-3.3333300000000000e+04
-3.3333330000000000e+05
-3.3333333000000000e+06
-3.3333333300000000e+07
-3.3333333330000000e+08
-3.3333333333000000e+09
-3.3333333333300000e+10
-3.3333333333330000e+11
-3.3333333333333000e+12
-3.3333333333333300e+13
-3.3333333333333330e+14
-3.3333333333333333e+15
-3.3333333333333333e+16
-3.3333333333333333e+17
*** STOP - ConvertReal10CTE ***
-4.4000000000000000e+00
-4.4400000000000000e+01
-4.4440000000000000e+02
-4.4444000000000000e+03
-4.4444400000000000e+04
-4.4444440000000000e+05
-4.4444444000000000e+06
-4.4444444400000000e+07
-4.4444444440000000e+08
-4.4444444444000000e+09
-4.4444444444400000e+10
-4.4444444444440000e+11
-4.4444444444444000e+12
-4.4444444444444400e+13
-4.4444444444444440e+14
-4.4444444444444444e+15
-4.4444444444444444e+16
-4.4444444444444444e+17
-5.5000000000000000e+00
-5.5500000000000000e+01
-5.5550000000000000e+02
-5.5555000000000000e+03
-5.5555500000000000e+04
-5.5555550000000000e+05
-5.5555555000000000e+06
-5.5555555500000000e+07
-5.5555555550000000e+08
-5.5555555555000000e+09
-5.5555555555500000e+10
-5.5555555555550000e+11
-5.5555555555555000e+12
-5.5555555555555500e+13
-5.5555555555555550e+14
-5.5555555555555555e+15
-5.5555555555555556e+16
-5.5555555555555556e+17
-6.6000000000000000e+00
-6.6600000000000000e+01
-6.6660000000000000e+02
-6.6666000000000000e+03
-6.6666600000000000e+04
-6.6666660000000000e+05
-6.6666666000000000e+06
-6.6666666600000000e+07
-6.6666666660000000e+08
-6.6666666666000000e+09
-6.6666666666600000e+10
-6.6666666666660000e+11
-6.6666666666666000e+12
-6.6666666666666600e+13
-6.6666666666666660e+14
-6.6666666666666666e+15
-6.6666666666666667e+16
-6.6666666666666667e+17
-7.7000000000000000e+00
-7.7700000000000000e+01
-7.7770000000000000e+02
-7.7777000000000000e+03
-7.7777700000000000e+04
-7.7777770000000000e+05
-7.7777777000000000e+06
-7.7777777700000000e+07
-7.7777777770000000e+08
-7.7777777777000000e+09
-7.7777777777700000e+10
-7.7777777777770000e+11
-7.7777777777777000e+12
-7.7777777777777700e+13
-7.7777777777777770e+14
-7.7777777777777777e+15
-7.7777777777777778e+16
-7.7777777777777778e+17
*** STOP - ConvertReal10CTE ***
-8.8000000000000000e+00
-8.8800000000000000e+01
-8.8880000000000000e+02
-8.8888000000000000e+03
-8.8888800000000000e+04
-8.8888880000000000e+05
-8.8888888000000000e+06
-8.8888888800000000e+07
-8.8888888880000000e+08
-8.8888888888000000e+09
-8.8888888888800000e+10
-8.8888888888880000e+11
-8.8888888888888000e+12
-8.8888888888888800e+13
-8.8888888888888880e+14
-8.8888888888888888e+15
-8.8888888888888889e+16
-8.8888888888888889e+17
-9.9000000000000000e+00
-9.9900000000000000e+01
-9.9990000000000000e+02
-9.9999000000000000e+03
-9.9999900000000000e+04
-9.9999990000000000e+05
-9.9999999000000000e+06
-9.9999999900000000e+07
-9.9999999990000000e+08
-9.9999999999000000e+09
-9.9999999999900000e+10
-9.9999999999990000e+11
-9.9999999999999000e+12
-9.9999999999999900e+13
-9.9999999999999990e+14
-9.9999999999999999e+15
-1.00000000000000000e+17
-1.00000000000000000e+18
*** STOP - ConvertReal10CTE ***
1.00000000000000000e-01
1.00000000000000000e-02
1.00000000000000000e-03
1.00000000000000000e-04
1.00000000000000000e-05
1.00000000000000000e-06
1.00000000000000000e-07
1.00000000000000000e-08
1.00000000000000000e-09
1.00000000000000000e-10
1.00000000000000000e-11
1.00000000000000000e-12
1.00000000000000000e-13
1.00000000000000000e-14
1.00000000000000000e-15
1.00000000000000000e-16
1.00000000000000000e-17
1.00000000000000000e-18
*** STOP - ConvertReal10CTE ***
2.0000000000000000e-01
2.0000000000000000e-02
2.0000000000000000e-03
2.0000000000000000e-04
2.0000000000000000e-05
2.0000000000000000e-06
2.0000000000000000e-07
2.0000000000000000e-08
2.0000000000000000e-09
2.0000000000000000e-10
2.0000000000000000e-11
2.0000000000000000e-12
2.0000000000000000e-13
2.0000000000000000e-14
2.0000000000000000e-15
2.0000000000000000e-16
2.0000000000000000e-17
2.0000000000000000e-18
*** STOP - ConvertReal10CTE ***
3.0000000000000000e-01
3.0000000000000000e-02
3.0000000000000000e-03
3.0000000000000000e-04
3.0000000000000000e-05
3.0000000000000000e-06
3.0000000000000000e-07
3.0000000000000000e-08
3.0000000000000000e-09
3.0000000000000000e-10
3.0000000000000000e-11
3.0000000000000000e-12
3.0000000000000000e-13
3.0000000000000000e-14
3.0000000000000000e-15
3.0000000000000000e-16
3.0000000000000000e-17
3.0000000000000000e-18
*** STOP - ConvertReal10CTE ***
4.0000000000000000e-01
4.0000000000000000e-02
4.0000000000000000e-03
4.0000000000000000e-04
4.0000000000000000e-05
4.0000000000000000e-06
4.0000000000000000e-07
4.0000000000000000e-08
4.0000000000000000e-09
4.0000000000000000e-10
4.0000000000000000e-11
4.0000000000000000e-12
4.0000000000000000e-13
4.0000000000000000e-14
4.0000000000000000e-15
4.0000000000000000e-16
4.0000000000000000e-17
4.0000000000000000e-18
*** STOP - ConvertReal10CTE ***
5.0000000000000000e-01
5.0000000000000000e-02
5.0000000000000000e-03
5.0000000000000000e-04
5.0000000000000000e-05
5.0000000000000000e-06
5.0000000000000000e-07
5.0000000000000000e-08
5.0000000000000000e-09
5.0000000000000000e-10
5.0000000000000000e-11
5.0000000000000000e-12
5.0000000000000000e-13
5.0000000000000000e-14
5.0000000000000000e-15
5.0000000000000000e-16
5.0000000000000000e-17
5.0000000000000000e-18
*** STOP - ConvertReal10CTE ***
6.0000000000000000e-01
6.0000000000000000e-02
6.0000000000000000e-03
6.0000000000000000e-04
6.0000000000000000e-05
6.0000000000000000e-06
6.0000000000000000e-07
6.0000000000000000e-08
6.0000000000000000e-09
6.0000000000000000e-10
6.0000000000000000e-11
6.0000000000000000e-12
6.0000000000000000e-13
6.0000000000000000e-14
6.0000000000000000e-15
6.0000000000000000e-16
6.0000000000000000e-17
6.0000000000000000e-18
*** STOP - ConvertReal10CTE ***
7.0000000000000000e-01
7.0000000000000000e-02
7.0000000000000000e-03
7.0000000000000000e-04
7.0000000000000000e-05
7.0000000000000000e-06
7.0000000000000000e-07
7.0000000000000000e-08
7.0000000000000000e-09
7.0000000000000000e-10
7.0000000000000000e-11
7.0000000000000000e-12
7.0000000000000000e-13
7.0000000000000000e-14
7.0000000000000000e-15
7.0000000000000000e-16
7.0000000000000000e-17
7.0000000000000000e-18
*** STOP - ConvertReal10CTE ***
8.0000000000000000e-01
8.0000000000000000e-02
8.0000000000000000e-03
8.0000000000000000e-04
8.0000000000000000e-05
8.0000000000000000e-06
8.0000000000000000e-07
8.0000000000000000e-08
8.0000000000000000e-09
8.0000000000000000e-10
8.0000000000000000e-11
8.0000000000000000e-12
8.0000000000000000e-13
8.0000000000000000e-14
8.0000000000000000e-15
8.0000000000000000e-16
8.0000000000000000e-17
8.0000000000000000e-18
*** STOP - ConvertReal10CTE ***
9.0000000000000000e-01
9.0000000000000000e-02
9.0000000000000000e-03
9.0000000000000000e-04
9.0000000000000000e-05
9.0000000000000000e-06
9.0000000000000000e-07
9.0000000000000000e-08
9.0000000000000000e-09
9.0000000000000000e-10
9.0000000000000000e-11
9.0000000000000000e-12
9.0000000000000000e-13
9.0000000000000000e-14
9.0000000000000000e-15
9.0000000000000000e-16
9.0000000000000000e-17
9.0000000000000000e-18
*** STOP - ConvertReal10CTE ***
-1.2345678912345600e+00
-1.23456789123456000e+01
-1.23456789123456000e+02
-1.2345678912345600e+03
-1.23456789123456000e+04
-1.23456789123456000e+05
-1.2345678912345600e+06
-1.23456789123456000e+07
-1.23456789123456000e+07
-1.23456789123456000e+08
-1.2345678911234560e+09
-1.23456789121234560e+10
-1.23456789123123456e+11
-1.2345678912341235e+12
-1.23456789123451235e+13
-1.23456789123456123e+14
-1.2345678912345671e+15
-1.23456789123456781e+16
-1.23456789123456789e+17
*** STOP - ConvertReal10CTE --- E N D ---***


Gunther
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 20, 2013, 10:38:58 AM
boa tarde, RuiLoureiro,!
3.00GHz 3.49Gb RAM Pentium 4 (SSE4) (01.zip)
465 MHz, 256 Mb RAM Celeron (02.zip)
Este é um novo e mais rápido versão da função Eprst (New version Eprst); masm windows console #
include \masm32\include\masm32rt.inc
includelib \masm32\lib\kernel32.lib
extern _imp__SetPriorityClass@8:dword
extern _imp__GetCurrentProcess@0:dword
.686
.mmx
.xmm
.data
    _Real10_R dt ?
count1 dd 1000000
count2 dd ?
rdtsc_timer dq ?
timer1 dd ?
max_ten REAL10 1.0e+4931
.code
START_COUNTER_CYCLE_HIGH_PRIORITY_CLASS macro
                 call    _imp__GetCurrentProcess@0
                 push    HIGH_PRIORITY_CLASS ; dwPriorityClass
                 push    eax             ; hProcess
                 call    _imp__SetPriorityClass@8
                 xor     eax, eax
                 cpuid
                 rdtsc
                 push    edx
                 push    eax
                 mov     count2,1000000
                 xor     eax,eax
                 cpuid
                 lea     esp,[esp+0]
                 add     eax,0
@@:              sub     count2, 1
                 jnz     short @b
                 xor     eax, eax
                 cpuid
                 rdtsc
                 pop     ecx
                 sub     eax, ecx
                 pop     ecx
                 sbb     edx, ecx
                 push    edx
                 push    eax
                 xor     eax, eax
                 cpuid
                 rdtsc
                 push    edx
                 push    eax
                 mov     count2,1000000
                 xor     eax, eax
                 cpuid
                 lea     ecx, [ecx+0]
endm
main proc
LOCAL result[32]:BYTE

    fldpi
    fstp tbyte ptr _Real10_R
    START_COUNTER_CYCLE_HIGH_PRIORITY_CLASS
@@: lea eax,result
push eax
push offset _Real10_R
call Eprst
                 sub     count2, 1
                 jnz     @b
                 xor     eax, eax
                 cpuid
                 rdtsc
                 pop     ecx
                 sub     eax, ecx
                 pop     ecx
                 sbb     edx, ecx
                 pop     ecx
                 sub     eax, ecx
                 pop     ecx
                 sbb     edx, ecx
                 mov     dword ptr rdtsc_timer, eax
                 mov     dword ptr rdtsc_timer+4, edx
                 call    _imp__GetCurrentProcess@0
                 push    NORMAL_PRIORITY_CLASS ; dwPriorityClass
                 push    eax             ; hProcess
                 call    _imp__SetPriorityClass@8
                 finit
                 fild    rdtsc_timer
                 fild    count1
                 fdivp   st(1), st
                 fistp   timer1

print str$(timer1),13,10
    inkey " *** STOP - Eprst --- E N D ---*** "
    exit
   
main endp



    $max equ 90; <-- This number may be increased
    magic1 equ 4D10h;lg(2)*65536=19728,3...
    magic2  equ 35269h;log2(10)*65536=3,32192809488736234780*65536=217705,8796265381788254208..
.const
    cntr = -$max
    REPEAT 2*$max+1
        IF cntr NE 0
            REAL10 @CatStr(<1.0e>,%-cntr)
        ELSE
            tabs REAL10 1.0
        ENDIF
        cntr = cntr + 1
    ENDM

    table0  label word
n=0
rept 100
dw (n mod 10 shl 8)+(n/10)+"00"
n=n+1
endm   
    table1 dd shift0,shift1,shift2,shift3,shift4
.code
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 aExp,0
mov eax,[ecx+4]
mov [x],ebx
movzx edx,word ptr [ecx+8]
mov [x+4],eax
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
Zero_Or_Denormal_or_Normal: cmp edx,eax
jnz Denormal_or_Normal
        cmp ebx,eax
jnz Denormal_or_Normal
mov dword ptr [edi+1],'oreZ'
mov ebx,[esp+buffer];pop ebx
mov dword ptr [edi+5],0
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
        retn 8
Denormal_or_Normal: test eax,80000000h
jnz _Normal
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 _Normal
a2: cmp edx,7FFFh
jz Infinity_Or_SNAN_Or_QNAN_Or_Uncertainty
_Normal:mov esi,10
sub edx,16383
mov word ptr [edi+21],'+E'
imul edx,magic1
and edx,0FFFF0000h
sar edx,15
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
load: fld tabs[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]
shift4::test eax,60000000h
jz a6
fld tabs[10]
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
shift3::shld edx,eax,3
shld eax,ebx,3
shl ebx,3
add ebx,9;10
jmp shift0
shift2::shld edx,eax,2
shld eax,ebx,2
shl ebx,2
add ebx,8
jmp shift0
shift1::shld edx,eax,1
shld eax,ebx,1
shl ebx,1
add ebx,4
shift0::adc eax,0
adc edx,0
mov [edi+1],dl
mov byte ptr [edi+2],','
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*2] ;edx = quotient of the division by 100
mov dword ptr [edi+23],eax
lea eax,[edx*4]
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*2]
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
        mov dword ptr [edi+1],'ifnI'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+5],'ytin'
        mov dword ptr [edi+9],0
mov esi,[esp+buffer+4];pop esi
mov edi,[esp+buffer+8];pop edi
add esp,buffer+12
ret 8
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
error: mov dword ptr [edi+1],'orrE'
mov ebx,[esp+buffer];pop ebx
        mov dword ptr [edi+5],'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
and describe the contents of macro "SAVE_COUNTER_CYCLE" as the asm-file please
Title: Re: Converting a Real10 to string
Post by: Gunther on May 20, 2013, 09:12:20 PM
Hi Mikl__,

could you include the running program, please? The images are interesting, but results will be different from machine to machine.

Gunther
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 20, 2013, 09:24:39 PM
Hi, Gunther!
Tell me please how you sent the results of TestCycles10_18E.exe -- in command line write "TestCycles10_18E > 1.txt" ? The TestCycles10_18E.exe and other programs are waiting when I press to any key with black skreen and I don't know is ready results or isn't ready. The pictures are results of printscreen of program TestCycles10_18E.exe
Title: Re: Converting a Real10 to string
Post by: dedndave on May 20, 2013, 09:53:42 PM
you can right-click on the console window, then Select All
then paste into the reply window
sometimes, i have to do it twice before it works   :redface:
then, i edit out the stuff i don't want, like the Microsoft Windows version and the command prompt

what he wants is the ASM and EXE files, though
put them in a ZIP file and attach them to the reply
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 20, 2013, 10:03:11 PM
Hi, dedndave! Thank you very much!!! :t
Title: Re: Converting a Real10 to string
Post by: Gunther on May 20, 2013, 11:43:22 PM
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
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 20, 2013, 11:48:30 PM
Hi Gunther!Thank you!! I have Win XP
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 21, 2013, 03:00:14 AM
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
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 22, 2013, 05:48:50 PM
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
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 26, 2013, 12:16:54 PM
"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
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 27, 2013, 12:44:09 AM
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

Title: Re: Converting a Real10 to string
Post by: dedndave on May 27, 2013, 01:25:18 AM
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
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 27, 2013, 06:46:45 AM
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.
Title: Re: Converting a Real10 to string
Post by: Mikl__ on May 27, 2013, 10:20:21 AM
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!
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on May 28, 2013, 02:16:43 AM
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
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
Title: Re: Converting a Real10 to string
Post by: Mikl__ on June 02, 2013, 10:25:08 PM
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
Title: Re: Converting a Real10 to string
Post by: Mikl__ on June 02, 2013, 10:26:55 PM
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
Title: Re: Converting a Real10 to string
Post by: Mikl__ on June 02, 2013, 10:30:46 PM
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!
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on June 03, 2013, 07:13:17 AM
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- **

Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on June 03, 2013, 07:17:42 AM
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
Title: Re: Converting a Real10 to string
Post by: dedndave on June 03, 2013, 08:10:24 AM
prescott w/htt - xp mce2005 sp3
3,141592653589793238E+0000
3.141592653589793238
*** STOP - Eprst+ConvertReal10KX- PI ***
580 cycles, Eprst, _Real10_PI

340 cycles, ConvertReal10KX, _Real10_PI

571 cycles, Eprst, _Real10_PI

340 cycles, ConvertReal10KX, _Real10_PI


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

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

340  cycles, ConvertReal10KX -19 digits
340  cycles, ConvertReal10KX -19 digits
571  cycles, Eprst -19 digits
580  cycles, Eprst -19 digits
*** END converting PI - Eprst + ConvertReal10KX- ***
Title: Re: Converting a Real10 to string
Post by: dedndave on June 03, 2013, 08:17:00 AM
EvalReal takes about 3,000 cycles   :lol:
Title: Re: Converting a Real10 to string
Post by: Mikl__ on June 17, 2013, 10:38:43 AM
3,141592653589793238E+0000
3.141592653589793238
*** STOP - Eprst+ConvertReal10KX- PI ***
165 cycles, Eprst, _Real10_PI

179 cycles, ConvertReal10KX, _Real10_PI

165 cycles, Eprst, _Real10_PI

177 cycles, ConvertReal10KX, _Real10_PI


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

Intel(R) Pentium(R) CPU G860 @ 3.00GHz (SSE4)

165  cycles, Eprst -19 digits
165  cycles, Eprst -19 digits
177  cycles, ConvertReal10KX -19 digits
179  cycles, ConvertReal10KX -19 digits
*** END converting PI - Eprst + ConvertReal10KX- ***

$MagicLog2_32    equ 1292913987     ; = log(2) * 2^32
    dp_1    equ 17      ; = decimal places minus 1
    dp4     equ dp_1+4
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
; Input:
;           esi = 10
;
EXPONENTREAL_10KM MACRO
;to calculate the absolute value of a signed integer without branching
                cdq
                xor      eax,edx
sub eax,edx            ; make number positive
                and dl,2
                add      byte ptr[edi+22],dl;if eax>=0 then "plus" else "minus"
                mov      edx,4294968        ;2^32/1000
                mul      edx                ;extend first digit
                shrd     ecx,edx,8          ;digit 1 in ECX
                mul      esi                ;extend second digit
                shrd     ecx,edx,8          ;digit 2 in ECX
                mul      esi                ;extend third digit
                shrd     ecx,edx,8          ;digit 3 in ECX
                mul      esi                ;extend fourth digit
                shrd     ecx,edx,8          ;digit 4 in ECX
                or       [edi+23],ecx       ;make ASCII string               
ENDM
;---------------------------------------------
$maxexp     equ 90
$maxcounter equ 2*$maxexp+1
;---------------------------------------------
.data
realexp4931    dt 1.0e+4931
        shifttableX    dd shift0X    ; +0
                        dd shift1X    ; +4
                        dd shift2X    ; +8
                        dd shift3X    ;+12
                        dd shift4X    ;+16
;---------------------------------------------
    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
;----------------------------------------------------
.code

align 16
Eprst         proc
; locals, buffer and args
pReal10 equ dword ptr [esp+16+buffer]
pStr equ pReal10+4
iExp equ dword ptr [esp-4];0+4=4
aExp equ iExp-4           ;4+4=8
realx equ aExp-4*3         ;8+12=20
temp equ realx-4*3        ;20+12=32
buffer = 20h     
                        ;
                          push    ebx
                          push    esi
                          push    edi
                          sub   esp, buffer
                          mov     ecx, pReal10                                         
                        ; ---------------------------
                        ;        remove sign
                        ;    move real10 to realx
                        ; if iExp=0 we use this realx
                        ; ---------------------------
;to calculate the sign of number without branching

                  mov     edx, dword ptr [ecx+6]
                  add   edx, edx; if CF=1 then negative
                  mov     edi, pStr
  sbb     eax, eax; if CF=0 then EAX = 0 else EAX = -1
                          and   eax, 0Dh
                          mov     aExp, 0
                          or      eax, 2C0020h
                          mov   [edi], eax; if CF=0 then EAX = 2C0020h else EAX = 2C002Dh
                  shr   edx, 17 ; remove sign and if EDX = 0 go to _expzero

                  mov     ebx, [ecx+0]
                  mov     ecx, [ecx+4]

                  mov     [realx+0], ebx
                  mov     [realx+4], ecx
                  mov     [realx+8], edx ; only exponent
                  jz      _expzero ; if exponent = 0       
        _expnotzero:      cmp     edx, 7FFFh
                  je      _isinfinity
                        ;
                          test    ecx, ecx
                          jns     _erro1   ; if integer = 0 and exponent <> 0 then ERROR
                          mov     ecx, pReal10
                          fld   tbyte ptr [ecx]
                          jmp     _begin
                        ; ------------------------
                        ;       exponent = 0
                        ; ------------------------
_expzero:                 or      ebx, ecx
                          jz      _iszero       ; if edx = ebx = ecx = 0 is zero
                          mov     ecx, pReal10
                          fld   tbyte ptr [ecx]
                        ;-------------------------
                        ;    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]
                  and   [realx+8],7FFFh; remove sign FABS
                  mov     eax, [realx+4]
                  mov     edx, [realx+8]
                        ;---------------------
                        ;       start
                        ;---------------------
                _begin:   mov     esi, 10                                                   
;-----------------------------------------------------------------
;FILD + FLDLG2 + FMUL + FISTP                                             

  mov     eax, $MagicLog2_32   ; log(2)*2^32
                  sub     edx, 3FFFh           ; =16383
                  imul    edx
                  mov     iExp, edx
  or   edx,edx
                          jz      short _getrealx ;edx = 0 ?
                          cmp   edx, -1
                          je      _new ;integer multipication to 10
                  cmp     edx, $maxexp
                  jg      @F
                  cmp     edx,-$maxexp
                  jge     short _load
;------------------------------------------------
;FSCALE is slow on all processors. Computing integer powers of 2 can be done
;much faster by inserting the desired power in the exponent field of the
;floating-point number.

                 @@:      neg     edx
                  fldl2t   ; log2(10)
                  mov     [temp+8],edx           
                  fild    [temp+8]        ; x
  mov     [temp+0],0
                          fmul                    ; z = x * log2(10)
  mov     [temp+4],3F000000h ; 0.5
                          fld     st
                          fsub    [temp+4]        ; z - 0.5
                          fistp   [temp+8]        ; round(z)
          mov     [temp+4],80000000h
          fisub   [temp+8]        ;z - round(z)
                          f2xm1                   ; 2^(mantissa)-1
          add     [temp+8],3FFFh  ; 2^round(z)
                          fld1
                          fadd                    ; add 1 and pop
                          fld     tbyte ptr temp
                          fmul                    ; 2^((mantissa)*round(z))
                          jmp     short @F        ;_multiply                       
;--------------------------------------------------------       
            _load:   shl     edx, 2                       ; edx = edx*4
                          fld     [PowerTable12+edx+edx*2]    ; edx = edx*12
;--------------------------------------------------------             
                @@:       fmul                    ; X * 10^expscaleS = d.??????             
                  fld      st              ; get a copy
                  fstp     tbyte ptr realx
                  xor      edx, edx
                  mov      ebx, [realx+0]
;----------------------------------------------------------------
        _getrealx:        mov      ecx, [realx+8]
                          mov      eax, [realx+4]
                        ;
                  and      ecx, 7FFFh
                  sub      ecx, 16382      ; 10=> exponent = 16386

                  cmp      ecx, 4
                  ja       shift0X
                  jmp      [shifttableX+ecx*4]
_new:                     mov      eax, ebx;[realx+0]
                          add      eax,1
                          mul      esi
                          mov      ebx, eax
                          mov      ecx, edx
                          mov      eax, [realx+4]
                          mul      esi
                          add      eax, ecx
                          jmp      _aa

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

                        ; ------------------------
                        ; correct exponent * 10^-1
                        ; exponent = exponent + 1
                        ; ------------------------
                  fld      [PowerTable12+12]          ; = 0.1
                  fmul
                  add      iExp, 1

                  fld      st                  ; NEW get a copy
                  fstp     tbyte ptr realx

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

                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;round       ;ecx=4 ebx+12
                  jmp      shift0X

                        ; -------------------------------
                        ;    fraction bits in EAX:EBX
                        ;    shift: EDX <- EAX <- EBX
                        ; -------------------------------
           shift3X::      shld     edx, eax, 3
                  shld     eax, ebx, 3
                  shl      ebx, 3              ; * 8
                  add      ebx, 10 ;round
                  jmp      shift0X

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

                        ; -------------------------------
                        ;    fraction bits in EAX:EBX
                        ;    shift: EDX <- EAX <- EBX
                        ; -------------------------------
           shift1X::      shld     edx, eax, 1
                  shld     eax, ebx, 1
                  shl      ebx, 1              ; * 2
                  add      ebx, 4              ;round
;-------------------------------------------------------
                        ; -------------------------------
                        ;  fraction bits in EDX:EAX:EBX
                        ; -------------------------------
           shift0X::      adc      eax, 0          ; add carry to eax and edx
    _aa:          adc      edx, '0'        ; ASCII convert
                        ;
                          mov      dword ptr [edi+21],'00+E';ASCII chars for exponent
  mov      dword ptr [edi+25],'00'
                  mov      [edi+1], dl     ;first char in string
                        ;------------------------------------------------
                        ;                 eax    ebx
                        ;                        10
                        ;                -----------
                        ;                 ecx    ebx
                        ;         edx     eax                       
                        ;    ------------------------
                        ;   edx+carry     eax    ebx
                        ;------------------------------------------------
                    k=3
                        REPEAT dp_1
                            mov     ecx,eax         ; save EAX
                            mov     eax,ebx
                            mul     esi             ; edx:eax=ebx*10
                            mov     ebx,eax
                            mov     eax,ecx         ; restore EAX
                            mov     ecx,edx         ; save EDX
                            mul     esi             ; edx:eax=eax*10
                            add     eax,ecx
                            adc     edx,'0'         ; ASCII convert
                            mov     [edi+k], dl     ; next char in string
                    k=k+1
                        ENDM
                            mov     ecx,eax         ; save EAX
                            mov     eax,ebx
                            mul     esi             ; edx:eax=ebx*10
                            mov     eax,ecx         ; restore EAX
                            mov     ecx,edx         ; save EDX
                            mul     esi             ; edx:eax=eax*10
                            add     eax,ecx
                            adc     edx,'0'         ; ASCII convert
                    mov     eax, iExp
                            mov     [edi+k], dl     ; last char in string
                            add     eax, aExp
                            jz      _exit ;if exponent=0 go to exit

                        EXPONENTREAL_10KM

            _exit:      mov edi,[esp+buffer] ;restore edi
                        mov esi,[esp+buffer+4] ;restore esi
                        mov ebx,[esp+buffer+8] ;restore ebx
                        fstp     st(0)              ;remove realx
                        add esp,buffer+12 ;remove buffer,locals
                        xor      eax, eax               ;sucsess code
                        retn 8 ;go to main program
;-----------------------------------------------------------
    _isinfinity:        test      ecx,ecx
                        jns      short _erro1               ; is NAN
                        cmp      ecx,80000000h
                        jnz      _other
                        or       ebx, ebx
                        jne      short _erro1               ; is NAN
                        mov      dword ptr [edi+1], "IFNI"
                        mov      dword ptr [edi+5], "YTIN"
                        mov      dword ptr [edi+9],0
                        xor      eax, eax
                        mov edi,[esp+buffer];pop      edi
                        mov esi,[esp+buffer+4];pop      esi
                        mov ebx,[esp+buffer+8];pop      ebx
                        add esp,buffer+12
                        ret 8
                        ;--------------------------
                        ; value to be converted = 0
                        ;--------------------------
        _iszero:        mov esi,[esp+buffer+4];pop      esi
                        mov      dword ptr [edi+1],"0.0"
                        mov ebx,[esp+buffer+8];pop      ebx
                        mov edi,[esp+buffer];pop      edi
                        add esp,buffer+12
                        xor      eax, eax
                        ret 8
                        ; --------------------
                        ; is indefinite or NAN
                        ; --------------------
        _erro1:         mov      eax, 1
                        mov      dword ptr [edi+1], "ORRE"
                        mov      dword ptr [edi+5], "R"
                        stc
                        mov edi,[esp+buffer];pop      edi
                        mov esi,[esp+buffer+4];pop      esi
                        mov ebx,[esp+buffer+8];pop      ebx
                        add esp,buffer+12
                        ret 8
        _other:         test    ecx,0BFFFFFFFh
                        jnz     _other1
                        mov      dword ptr [edi+1], "ngiS"
                        mov      dword ptr [edi+5], "nila"
                        mov      dword ptr [edi+9], "aN g"
                        mov      dword ptr [edi+13],"N"
                        xor      eax, eax
                        mov edi,[esp+buffer];pop      edi
                        mov esi,[esp+buffer+4];pop      esi
                        mov ebx,[esp+buffer+8];pop      ebx
                        add esp,buffer+12
                        ret 8
_other1:        cmp      ecx,0C0000000h
                        jnz     _Quit_NaN
                        or       ebx, ebx
                        jne     _Quit_NaN
                        mov      dword ptr [edi+1], "ednI"
                        mov      dword ptr [edi+5], "inif"
                        mov      dword ptr [edi+9], "et"
                        xor      eax, eax
                        mov edi,[esp+buffer];pop      edi
                        mov esi,[esp+buffer+4];pop      esi
                        mov ebx,[esp+buffer+8];pop      ebx
                        add esp,buffer+12
                        ret 8
      _Quit_NaN:        mov      dword ptr [edi+1], "eiuQ"
                        mov      dword ptr [edi+5], "aN t"
                        mov      dword ptr [edi+9], "N"
                        xor      eax, eax
                        mov edi,[esp+buffer];pop      edi
                        mov esi,[esp+buffer+4];pop      esi
                        mov ebx,[esp+buffer+8];pop      ebx
                        add esp,buffer+12
                        ret 8
Eprst         endp
Title: Re: Converting a Real10 to string
Post by: dedndave on June 17, 2013, 11:46:59 AM
3,141592653589793238E+0000
3.141592653589793238
*** STOP - Eprst+ConvertReal10KX- PI ***
361 cycles, Eprst, _Real10_PI

340 cycles, ConvertReal10KX, _Real10_PI

344 cycles, Eprst, _Real10_PI

346 cycles, ConvertReal10KX, _Real10_PI

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

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

340  cycles, ConvertReal10KX -19 digits
344  cycles, Eprst -19 digits
346  cycles, ConvertReal10KX -19 digits
361  cycles, Eprst -19 digits
*** END converting PI - Eprst + ConvertReal10KX- ***
Title: Re: Converting a Real10 to string
Post by: RuiLoureiro on June 13, 2016, 08:18:34 AM
Hi all
Mikl__, aqui está o trabalho que desenvolveste ( e eu colaborei )
e que tu aqui deixaste.
Very nice !
Thank you  :t