Mudanças entre as edições de "Ponto Flutuante"
De WikiLICC
m |
m |
||
(13 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 6: | Linha 6: | ||
− | {| class="wikitable sortable" style="text-align: | + | {| class="wikitable sortable" style="text-align: left" |
! Fortran | ! Fortran | ||
! tempo | ! tempo | ||
+ | ! Assembler | ||
|- | |- | ||
− | | < | + | | <code>a = 1.23D0 </code> |
− | | | + | | 15 μs |
+ | | fld ptr[1.23d0]; fstp ptr,[a] | ||
|- | |- | ||
− | | a = b | + | | <code>a = b</code> |
− | | | + | | 15 μs |
+ | | fld ptr[b]; fstp ptr[a] | ||
|- | |- | ||
− | | a = a+b | + | | <code>a = a+b</code> |
− | | | + | | 98 μs |
+ | | fld ptr[a]; fld ptr[b]; faddp st(1),st; fstp ptr[a] | ||
|- | |- | ||
− | | a = b+c | + | | <code>a = b+c</code> |
− | | | + | | 20 μs |
+ | | fld ptr[b]; fld ptr[c]; faddp st(1),st; fstp ptr[a] | ||
|- | |- | ||
− | | a = b-c | + | | <code>a = b-c</code> |
− | | | + | | 20 μs |
+ | | fld ptr[b]; fld ptr[c]; fsubp st(1),st; fstp ptr[a] | ||
|- | |- | ||
− | | a = b*c | + | | <code>a = b*c</code> |
− | | | + | | 20 μs |
+ | | fld ptr[b]; fld ptr[c]; fmulp st(1),st; fstp ptr[a] | ||
|- | |- | ||
− | | a = b/c | + | | <code>a = b/c</code> |
− | | | + | | 20 μs |
+ | | fld ptr[b]; fld ptr[c]; fdivp st(1),st; fstp ptr[a] | ||
|- | |- | ||
− | | a = sqrt( | + | | <code>a = sqrt(b)</code> |
− | | | + | | 121 μs |
+ | | push edi; fld ptr[b]; call _sqrtf; pop ecx; fstp ptr[a] (26 instrucoes) | ||
|- | |- | ||
− | | | + | | <code>if(b==0.d0)then</code> |
− | | | + | | 15 μs |
+ | | fld ptr[b]; fldz; fucompp; fnstsw ax; sahf; jne ENDIF | ||
+ | |- | ||
+ | | <code>end do</code> | ||
+ | | 16 μs | ||
+ | | inc ptr[i]; mov eax,ptr[i]; cmp eax,[1]; jle INICIO_LOOP | ||
|} | |} | ||
+ | |||
+ | ==Dados== | ||
+ | O valor de +2.0 (1.0 x 2<SUP><FONT SIZE="-1">1</FONT></SUP>) seria: | ||
+ | |||
+ | <pre>0 10000000 00000000000000000000000b (ou 40000000h em notação hexadecimal) | ||
+ | S 7Fh+1 fraction bits</pre> | ||
+ | |||
+ | e o valor de -2.0 seria: | ||
+ | |||
+ | <pre>1 10000000 00000000000000000000000b (ou C0000000h em notação hexadecimal</pre> | ||
+ | |||
+ | |||
+ | ==Ligações externas== | ||
+ | * http://www.website.masmforum.com/tutorials/fptute/index.html |
Edição atual tal como às 22h58min de 20 de agosto de 2009
Qual o tempo necessário para realizar uma operação em ponto flutuante?
No compilador Intel Fortran 11, Windows XP SP 3, Pentium 4 HT 3.00GHz obtive o seguinte resultado (5 testes, desprezando o pior e melhor resultado, e média dos 3 restantes).
real :: a,b,c
Fortran | tempo | Assembler |
---|---|---|
a = 1.23D0
|
15 μs | fld ptr[1.23d0]; fstp ptr,[a] |
a = b
|
15 μs | fld ptr[b]; fstp ptr[a] |
a = a+b
|
98 μs | fld ptr[a]; fld ptr[b]; faddp st(1),st; fstp ptr[a] |
a = b+c
|
20 μs | fld ptr[b]; fld ptr[c]; faddp st(1),st; fstp ptr[a] |
a = b-c
|
20 μs | fld ptr[b]; fld ptr[c]; fsubp st(1),st; fstp ptr[a] |
a = b*c
|
20 μs | fld ptr[b]; fld ptr[c]; fmulp st(1),st; fstp ptr[a] |
a = b/c
|
20 μs | fld ptr[b]; fld ptr[c]; fdivp st(1),st; fstp ptr[a] |
a = sqrt(b)
|
121 μs | push edi; fld ptr[b]; call _sqrtf; pop ecx; fstp ptr[a] (26 instrucoes) |
if(b==0.d0)then
|
15 μs | fld ptr[b]; fldz; fucompp; fnstsw ax; sahf; jne ENDIF |
end do
|
16 μs | inc ptr[i]; mov eax,ptr[i]; cmp eax,[1]; jle INICIO_LOOP |
Dados
O valor de +2.0 (1.0 x 21) seria:
0 10000000 00000000000000000000000b (ou 40000000h em notação hexadecimal) S 7Fh+1 fraction bits
e o valor de -2.0 seria:
1 10000000 00000000000000000000000b (ou C0000000h em notação hexadecimal