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 ---**
ConverterQQ.inc(424) : error A2006: undefined symbol : $TRUNCATE$ ::)
Quote from: jj2007 on April 28, 2013, 11:14:44 AM
ConverterQQ.inc(424) : error A2006: undefined symbol : $TRUNCATE$ ::)
Thanks Jochen,
$TRUNCATE$ equ 027fh
My last tests about real10 to string (47 procedures)
conclusion:
BCD are betterFor 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 **********
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
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
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
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 ---*** "
Olá, RuiLoureiro!
Claro, eu vou fazer isso amanhã...
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
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)
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]
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:
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.
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
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.
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 ?
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
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 >
Now for
19 digits - (no BCD)
_Real10_R = -12345678.12345678
we have:
note 1:
Float uses length; Real only null terminated stringnote 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 **********
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
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.
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 ***
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
∞
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 ---
maybe i should use +Infinity and -Infinity, rather than the lemniscate char :(
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
Quote; from DAVE evaluator prog:
;7FFF_80000000_00000000: +8 +∞ ?
;FFFF_80000000_00000000: -8
from IEEE754
Encodings of ±2
k+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 |
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)
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
dedndave,
Thank you very much! :t
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
; 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
data | value | Eprst |
dd 0,0,0h | +0.0 | Zero |
dd 0,0,8000h | -0.0 | -Zero |
dd 0,80000000h,3FFFh | 1.0 | 1,000000000000000000E+0000 |
dd 0,80000000h,4000h | 2.0 | 2,000000000000000000E+0000 |
dd 0FFFFFFFFh,0FFFFFFFFh,7FFEh | 1.18973149535723176505e+4932 | 1,189731495357231764E+4932 |
dd 0,80000000h,1 | 3.36210314311209350626e-4932 min positive normal | 3,362103143112092086E-4932 |
dd 0FFFFFFFFh,7FFFFFFFh,0 | 3.36210314311209350608e-4932 max subnormal | 3,362103143112093506E-4932 |
dd 1,0,0 | 3.64519953188247460253e-4951 min positive subnormal | 3,645199531882474602E-4951 |
dd 0,80000000h,7FFFh | +Infinity | Infinity |
dd 0,80000000h,0FFFFh | -Infinity | -Infinity |
dd 0FFFFFFFFh,0FFFFFFFFh,7FFFh | QNaN | Quiet 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 |
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 **********
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.
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 **********
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
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
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 **********
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
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
Hi Mikl__,
could you include the running program, please? The images are interesting, but results will be different from machine to machine.
Gunther
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
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
Hi, dedndave! Thank you very much!!! :t
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
Hi Gunther!Thank you!! I have Win XP
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
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
"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
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
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
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.
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!
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
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
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
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
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!
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- **
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
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- ***
EvalReal takes about 3,000 cycles :lol:
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
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- ***
Hi all
Mikl__, aqui está o trabalho que desenvolveste ( e eu colaborei )
e que tu aqui deixaste.
Very nice !
Thank you :t