Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Look up keyword
Like this
2Activity
0 of .
Results for:
No results containing your search query
P. 1
Fast Inverse Square Root

Fast Inverse Square Root

Ratings: (0)|Views: 275|Likes:
Fast method to calculate inverse square roots using IEEE
Fast method to calculate inverse square roots using IEEE

More info:

Published by: Caio César Carvalho Dias on Jun 16, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

07/08/2013

pdf

text

original

 
Página1
Fast Inverse Square Root 
 Autores
Prof. Dr. Fernando AuilUniversidade de São Paulo
 
Ariel Guimarães Benigno
 –
7556924;
 
Caio César Carvalho Dias
 –
7557720;
 
Felipe Deckert Costa
 –
7557988;
 
Renato Cristiam Domingos Junior
 –
7693862.
Introdução
No desenvolvimento de
video games
, o desempenho de processamento é muito almejado, já que muitas vezes énecessário repetir os mesmos cálculos milhões de vezes por segundo. Chegam a ser aceitas, às vezes, pequenasperdas de precisão em troca de maior velocidade.Na renderização de gráficos tridimensionais gerados por computador são utilizados vetores para determinar aluminosidade e a reflexão de uma superfície. E para normalizar um vetor, é necessário calcular a divisão deste pelanorma dos vetores:
̂||̂
̂
 
 
̂√  
Em face da necessidade de um cálculo veloz do recíproco da raiz quadrada, uma estranha implementação apareceuna Internet, inicialmente associado ao programador de jogos John Carmack. A seguir, eis o código endentado ecomentado por nós:
floatfastInverseSqrt
(
floatnumber
)
 
{
 longi
;
 floaty
;
 // Pega os bits do floati
=
 
*(
long
*)
 
&
number
;
 // Chute inicial para o método de Newtoni
=
 0x5F3759DF 
-
 
(
i
>> 
 1
);
 // Devolve os bits ao formato floaty
=
 
*(
float
*)
 
&
i
;
 // Aproximação por método de Newton
return
y
*
 
(
3 
-
number
*
y
*
y
)
 
*
 0.5f
;
 
}
 
Quando olhamos pela primeira vez esta função, dizemos
: “
Isso jamais retornaria o inverso da raiz quadrada de um
número”. Mas ao compilá
-la e testá-la, podemos ver que ela faz o trabalho com boa precisão, mais rapidamente queos métodos tradicionais. Para explicá-la, será necessário passarmos antes por três tópicos:
 
Como funciona o
ponto
flutuante”
?
 
O que é deslocar bits?
 
Para que serve o método de Newton?Faremos agora uma passagem por esses tópicos, e depois retomaremos a explicação do código.
 
Página2
Números em ponto flutuante
Por simples abstração do complexo, acostumamo-nos a nem
reparar como um número “com vírgula”
(fracionário)funciona. Por exemplo: escrevemos o número 2,5 e rapidamente já mensuramos que isto equivale a duas unidades emeia. Porém, quando mudamos para uma base que não seja a decimal, ficamos completamente perdidos.Vamos relembrar os conceitos da base decimal para um melhor entendimento de como o computador representa osnúmeros racionais.
Bases numéricas
Na base decimal, os algarismos variam de 0 a 9, e
cada um com um “peso” diferente. Este peso é relativo à distância
da vírgula
 –
quanto mais à esquerda, maior; quanto mais à direita, menor.Exemplificando:
6 7 8 9 , 1 3 5
10
3
10
2
10
1
10
0
10
-1
10
-2
10
-3










 

 

 Numa
base numérica n
, os algarismos variam de 0 a
, cada um com peso da potência de base
n
. Por exemplo,na base 2:
1 0 0 1 1 0 , 1 0 1
2
5
2
4
2
3
2
2
2
1
2
0
2
-1
2
-2
2
-3











 


 

 

 Essa mesma regra se aplica para qualquer

.
Padrão IEEE 748
Observando a necessidade de uma padronização para pontos flutuantes, o
Institute of Electrical and ElectronicsEngineers
(IEEE, pronuncia-se
eye-triple-e
) criou um padrão que oferecesse precisão e portabilidade para operaçõescom ponto flutuante.Este padrão segue uma ideia muito parecida com a da notação científica, onde os números são representados noseguinte formato:
 
 

 
 Onde
é denominada mantissa e
é a ordem de grandeza.
 
Página3No padrão IEEE 748 é a mesma coisa, exceto que é utilizada a base binária. Parando para analisar como seria, ficariaassim:
 

 
 Assim podemos representar qualquer número, exceto o zero, mas para este caso há um tratamento especial.Vejamos alguns exemplos de como representar números nesse formato:
 
 
 

 Observando que a parte inteira da mantissa sempre é igual a 1, a IEEE decidiu fazer um sistema onde isso ficassesubentendido, guardando apenas a parte fracionária da mantissa, a ordem de grandeza e o sinal do número.A grande maioria dos processadores trabalha com arquitetura de 32 bits, então se decidiu adaptar a representaçãopara esse tamanho, ficando assim:
 
O primeiro bit da esquerda (o dígito mais significativo) armazena o sinal. Se estiver definido, é um númeronegativo; caso contrário, positivo.
 
Do segundo ao nono bit é armazenada a ordem de grandeza, porém é somado 127 a ele, para que não sejanecessário armazenar números negativos.
 
Do décimo ao trigésimo segundo, é armazenada a parte fracionária da mantissa.Assim, todos os 32 bits do
single-precision floating point 
(ou
float 
) são preenchidos por completo de maneirabastante otimizada.Observe na figura abaixo como ficaria uma representação visual do formato:
 
(8 bits)
(23 bits)
0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0Uma formula genérica para retornar o valor original é:



 Explicando parte a parte a fórmula:
 
Elevar -1 a 0 faz o sinal negativo sumir, tornando o número positivo. Caso contrário, se
s
for 1, o resultado énegativo.
 
É necessário somar 1 à mantissa, já que é armazenada apenas a parte fracionária da mesma.
 
A multiplicação por 2 elevado a (e
 –
127)
ocorre para devolver a “posição original” do número. O
-127 estáali porque 8 bits são capazes de armazenar inteiros de 0 até 255; subtraindo 127 a faixa torna-se de -127 a128, o que nos permite representar números menores que 1.Vamos aplicar a fórmula ao número da tabela para exemplificar:



 
()
 

 

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->