AOC - Ponto Flutuante

You might also like

You are on page 1of 10
arozie021 PDFs viewer Engenharia de Computacao Professor Juliano PONTO FLUTUANTE Representagdes de Niimeros Fracionarios * Use os Exercicios de Fixacdo ao final para se orientar para a prova. BINARIO EM NOTACAO CIENTIFICA Podemos usar casas binarias da mesma forma que casas decimais. Quanto vale o mimero 101.011,7' Seguimos as regras normalmente, elevando 2 & posicio do bit: T*DeORDTDORL TED HID? = 440414061/441/8 ~ 540.2540.125 ~ 5.37539 Se quisermos, podemos exprimir este niimero deslocando o “ponto bindrio” (tecnicamente nao é “ponto decimal”, certo?); todos os exemplos abaixo representam o mesmo nimero: 0.0000101011, * 2”= 0.0419921875 * 128 = 5.37510 0.101011, * 2° 1.01011, * 2 10.1011; * 2! 101.0112 "2° 1010.11, * 2° 101011; "2° 101011.0;* 2° 101011000.0; *2* = 101.0110000; (ponto deslocade 6 casas) Podemos entender o riimero em negrito como: 0.101011., mas desloque 0 ponto trés casas & direita, seguindo © expoente de 2°, ou seja, 101.0114, Se o expoente for negativo, deslocamos 0 ponto & esquerda. Como qualquer niimero fracionario diferente de zero possui ao menos um bit em 1, podemos escolher o expoente de forma que o 1 mais & esquerda esteja na primeira casa; no exemplo, 1.01011, com o expoente 2. Outro exemplo: o niimero 100101.1010, pode ser escrito como 1.001011010; * 2°. Desta forma, podemos representar este niimero usando s6 a parte fracionaria bindria (001011010,), chamada mantissa ou significando, e o expoente da base 2 (0 +5), além do sinal do niimero (+ ou -), obviamente. Esta é a esséncia dos niimeros em ponto flutuante (6 ponto binério “Alutua”). 1 Vou usar ponto em vez de virgula, a contragosto, hitpsiictoud ufpr edu bindex phplskokKYE7jaYuyLvH, ano arozie021 PDFs viewer CONVERSOES PARA BINARIO Sempre dé pra tentar fazer conversdes de cabeca, mas isso ¢ desconfortavel. Por exemplo, como representar 0.6713? Oras, %=0.5 € menor, 4+%0.75 é maior, entao temos 0.10.<0.67; se somarmos 1/8, temos 0.5+0+0.125+...? Portanto, 0.101,0.625 esta mais préximo, basta irmos adicionando mais bits pra melhorar a preciso. Melhor ser sistemstico. Para conversio de decimal para ponto flutuante, 0 método mais simples é 0 seguinte: primeiro convertemos a parte inteira, depois vamos multiplicando a parte fracionéria por dois, tomando o primeiro digito. Por exemplo, para p-3.141593, temos 3.-11, inicialmente. Entao: 0.141592*20,283184 retiramos 0 0 566368 retiramos 0 0 -132736 retiramos 01 530944 retiramos 00 .061888 retiramos 0 1 0.061888"2-0.123776 retiramos 0 0 ¢ assim por diante, Montandbo os bits retirados, em ordem, finalmente temos p=11.0010010.. PONTO FIXO PARA SISTEMAS EMBARCADOS Nimeros representados em ponto fixo séo ntimeros racionais bindrios em que se arbitra uma posi¢ao para 0 ponto binario. Por exemplo, se tivermos 12 bits e arbitrarmos 0 ponto entre bd e bs (b0 é 0 LSB, a direita), o ntimero 100010001000, significa 1000100.01000;, ou. seja, 2%2"2" = 64 +4 + 1/4 = 68,25. Outra forma de fazer o cAlculo: 100010001000; = 2184,5; como 0 maior niimero em 12 bits é 2°-1 = 4095,0, a fracdo representada é 2184/4095 ~ 0.5333... Basta multiplicar isso pelo maior mimero representavel, 111111111111; = 127.96875,. Portanto obtemos 127.96875 * 0.5333... = 68.2499999995734375, Ponto fixo utiliza os mesmos circuitos de soma ¢ subtragéo que os ntimeros inteiros (pense um pouco nisso) e necesita apenas ajustar a posicao do ponto para operacdes de multiplicacdo, portanto a implementacéo em software é direta: as contas ficam répidas e so faceis de implementar, dispensando 0 uso de floats e seus lentos circuits adicionais. Em sistemas embarcados com restrigdes severas de velocidade de execucao, tamanho de cédigo ou de circuito/consumo, usar ponto fixo pode ser bastante importante. Microcontroladores muito modestos simplesmente nao possuem circuitos para float, que devem ser simulados por software se necessdrio, e diversos processadores possibilitam a ULA de floats ser simplesmente desligada para economizar energia’. 2 Umaartigo interessante descreve circunstncias nas quais ndo ¢ boa ideia desligar esse médulo para tentar economizar energia. Vela uma c6pia em hups//swww eelournal com/article/20080812 eembc! e as figuras no meu Wordpress. hitpsiictoud fpr edu brindex phplskokKYE7jauyLvH, ano arozie021 PDFs viewer PADRAO IEEE 754 Este é 0 padrao da indiistria; outras implementacdes que nao seguem este padrao sao, na verdade, muito similares a ele. Os miimeros em ponto flutuante sao representados em binério e quebrados em trés valores: sinal, mantissa e expoente. Por exemplo, rem bindrio é: 3.1416; 11.001001000; pois 242227424 24140.12540.015625 ~ 3.140625, (perceba a aproximacio provocada pelo erro de precisio). Vamos representar 1 em float usando, como exemplo, 16 bits (praticamente o half precision). Sendo r~ 1.10010010;*2* (notacao “cientifica bindria”), o primeiro 1 (0 MSB, & esquerda) sempre fica implicito, pois ele sempre existe (certo?) entao os dados da mantissa sao 1001001000, Como 0 expoente é 1, temos: sinal expoente mantissa 0 (positivo) 00001 1001001000 Outro exemplo: os digitos bindrios 1111 1000 1000 1000 (sinal 1 = negativo, expoente 11110 = mantissa 0010001000 em itélico) significam, em half precision, -1.00100010;"2* = - 00100100010: = 0.25+0.03125+0.001953125 = 0.28320312510. Esse formato é usado em GPUS, por ser mais r4pido, ter circuits menores e por conta do processo de renderizacao de cerias 3D em jogos nao exigir muita precisio. Mais comuns, na terminologia da linguagem C, sao o float (“single precision”) de 32 bits, usado para economizar meméria, o double (“double precision”) de 64 bits, que é 0 mais comum, e 6 long double com 80 bits, que representa o maximo gerenciavel pela circuitaria de um PC moderno. Nosso exemplo utiliza um expoente de 5 bits em complemento de 2, 0 que nos resulta extremos numéricos de -1.1111111111;*2* (menor niimero) e +1.111111111142" (maior rimero). Os ntimeros mais préximos de zero, no entanto, so -1.0000000000."2"* +1,0000000000,*2**, Reflita para confirmar*. [OPCIONAL] EXPOENTE EM EXCESSO (BIAS) Infelizmente, essa representacio é inconveniente para comparagées entre dois mimeros. Por exemplo, se compararmos fl-11.11*2' com f2-11.11*27, obviamente flmf2. AS mantissas podem ser comparadas diretamente e o bit de sinal apenas precisa ser invertido. Mas se incluirmos o expoente, a comparacio nao é direta por ser sinalizada (no ex. 3 > -7, mas em bindrio temos 00011; > 11001,, que parece invalido se entendido sem complemento de 2). Uma solucio simples é utilizar representaco bindria com bias (em excesso). Em half precision, isso quer dizer adicionar a constante 15 ao expoente que havia sido calculado em complemento de 2, efetivamente eliminando os negativos. 0 resultado é que a comparacao pode ser feita diretamente entre os valores positivos excesso-15. 3 A-excegio € 0.0, que nao tem bit 1. Neste padra0, 0 eypoente zero com mantissa zero 6 usado para representar 0 mimero 0.0 (ou sea, todos obits s20 0). E um caso especial 4 Existem no IEEE 754 nimeros denormalizados que permitem que o bit mais significativo seja considerado zero ao invés de um, aumentando a precisto ao criarntimeros mals pr6xiinos de 0.0, mas estamos desconsiderando isso neste documenta, hitpsiictoud fpr edu brindex phplskokKYE7jauyLvH, ana arozie021 PDFs viewer Em fi, o expoente 3 passa a valer 3+15=18, e em 2.0 expoente -7 passa a valer 7615, -8; comparando diretamente, 18>8 ou 10010,> 01000,, tudo certo. Outro exemplo: queremos comparar fi=4.25 com f bindrios envolvidos? 1.0225. Quais os valores £3 = 100.01, = 1.1001*2? = £4 = 0,0000011; = 1.12 (0) (10001) 10010000007. pois 2+15-17-10001:. (0) (01001) 1100000000, pois -6+1: 11001. Invertendo o sinal, a comparacio pode ser feita como se fossem inteiros positives: 1100011001000000 > 1010011001000000. Sem isso, teriamos que comparar os sinais dos expoentes para agir de acordo. Cada representacao vai ter um bias distinto de acordo com o mimero de bits do expoente. 0 float tem 8 bits de expoente, portanto vai utilizar excesso 127 na codificagao (soma 2”-1-127 ao expoente); 0 double, com 11 bits, soma 2-1 - 1023, Veja no apéndice 2 uma tabela exemplo para uso anélogo com 4 bits. [ALGUNS CASOS ESPECIAIS Os niimeros +INF e -INF sto andlogos a + e —~». Alguns comportamentos so implementados (somar um néimero a +INF ou -INF resulta em +INF ou -INF, respec.), mas de forma geral deve-se considerar estes mimeros como comportamento aberrante do programa. Podem ser gerados por overflow (a expresso excede 0 maior miimero representvel) ou por uma divisao por zero, embora essa divisdo talvez gere uma excecio que paralisa o programa. Um underflow ocorre quando o resultado de uma expressio cai entre o zero e 0 ntimero representavel mais préximo do zero, ou seja, é menor do que o menor nimero possivel em médulo. Por exemplo, o menor niimero positive em half precision é 1.0000000000."2"*-0,000015259:0. Se 0 resultado é, digamos, 0.000000005, isso “nao é representavel” por ser muito pequeno. Underflows sao tratados com denormalizacao, ndo abordada neste documento. De forma andloga, ntimeros invalidos como 0.0/0.0, (+»-») ou sqrt(-1) resultam em NAN (Not A Number), e a maioria das operacdes com NAN resulta em NAN. Por fim, note que podemos ter zero positivo +0.0 € negativo -0.0, introduzindo algumas complicagSes nos circuitos, embora seja facil de tratar. EXATIDAO DAS REPRESENTAGOES A inica forma de representar uma fracio exata é armazenar o numerador eo denominador, que podem ser muito grandes. A limitacao de digitos produz imprecisdes inerentes a isso. PRECISAO ASSOCIADA A BASE NUMERICA Ntimeros fraciondrios so fracdes, divides. Como exprimir uma divisio por um niimero primo em fungao de outro ntimero primo? Resposta: nao da’. © niimero 1/3 é impossivel de representar em base decimal sem infinitos digitos ou arredondamento... Vamos mostrar: ‘Quer dizer, com ntimero infinito de digitos dé. Pra quem gosta de matemética mais pesada, dé pra pensar em Algebra, médulos e congrutncta,talvez Algebra Linear. hitpsiictoud fpr edu brindex phplskokKYE7jauyLvH, ana arozie021 PDFs viewer + 1/3~0.333.. (os trés pontos significam infinitos digitos decimais 3) + Com dois digitos significativos, 1/3 ~ 0.33 (portanto 0 erro é: 0.333..-0.33 = 0.0033: + Com quatro digitos significatives, 1/3 ~ 0.5333 (portanto o erro €:0.333..-0.3333 = 0.000033 + Com sete digitos significativos, 1/3 ~ 03333333 (portanto 0 erro é 0.333. 0.333333 = 0.0000000333..) Portanto é impossivel representar o niimero 1/3 em decimal com uma quantia exata. No entanto, 1/3 em base 3 é apenas 0.13, Esta quantia é EXATA, e possui apenas um digito ternério (!). Portanto a preciso ¢ exatidao de um niimero fracionério depende da base em que ele é expresso®, Confira 0 apéndice 1 para alguma intuigao a respeito. ASSOCIATIVIDADE Ao introduzirmos erros na representacao, alguns artefatos adicionais so gerados. 8 preciso associada ao expoente, em especial, faz com que somas e subtracdes em ponto flutuante ndo necessariamente sejam associativas! Veja: 1E+20 + 3E-10 ~ 1E+20 = 0. Ocorre que a expresso é avaliada da esquerda para a direita, e inicia com a soma de 1*10°=100000000000000000000.0 com 3*107°=0.00000000003, e o resultado nao é representavel pois faltam digitos significativos: precisariamos de 30 digitos decimais para representar 100000000000000000000,00000000005, que é truncado para 1*10™, UM EXEMPLO- Para comprovar os erros de preciso, podemos fazer um programa simples de teste de associatividade. Note-se que isso & mais dificil do que parece: 0 compilador tipicamente otimiza todos os cAlculos!’ Temos que insistir um pouco para conseguir 0 efeito em C. (Dentre outras coisas, instrugées vetoriais podem ser geradas*, pois dependendo do processador alvo e opcdes de compilacao, instrugdes como as MMX, SSE ou AVX do x86-64 podem ser mais rapidas, mesmo em algumas situacSes anti-intuitivas). Confira o programa? 6 Naimeros iracionats possuem infnites digitos, portanto sempre sofrem arredondamento em um rmicroprocessador 7 Antes de mais nada, € necessério desligat as otimizagbes (usando -00 no gcc, por exemplo). Algumas Tinguagens modernasiriam calcular f1 e £2 durante 2 compilacio e usar os resultados como constantes no programa final. Se fizermos diretamente fl = 1/3 * 1,245 * 1/7; a conta sera feita em tempo de compilagao, sem necessariamente gerar as instrucBes de multiplicagao de floats do processador alvo, 8 Porex,, para fazer “£1. ~ ~£2; vela:“.. Fld m32/Fstp m32 (é float] has 1 cycle higher round-tip latency than SSE nova [6 vetorial], and 2 cycles higher latency than integer nov [¢ int] on Sandybridge- family CPUs.” https:/stackoverflaw.com/questions/475.41077/loading-and-storingelong- int main(void) { float fl, f2, erro; fl = 1./3; fl *= 1/345; fl *= 1/7; #2.= 1/7; #2 += 1./345; #2 42 16/3; erro = f1-f2; printf ("%.11e\n%.11e\n%s.11e\n%.7e\n",1./3,f1,f2,erro); return 0; + lang version 7.0.0-3~ubuntu0.18.04.1 (tags/RELEASE,_700/final) > clang-7 -pthread -Im -o main main.c > /main 3,33333333333e-01 1,38026225613e-04 1.38026240165¢-04 4351915e-11 Por conta dos arredondamentos devidos A precisao limitada, (1/3 * 1/345) * 1/7 nao é& exatamente igual a 1/3 * (1/345 * 1/7); 0 erro é pequeno, na oitava casa decimal. Quantas casas decimais garantidas seré que nés temos entao? PRECISAO EM DiGITOS DECIMAIS Para simplificar bastante um assunnto meio espinhoso®, vamos usar uma tabelinha marota com os tipos em C em um PC moderno: Tipo Bitsna Bitsde |Digitos | Expoente |Exp bin |Exp bin mantissa expoente|decimais |decimal |méx min half precision | rr s| 331] 0.333)? E posssivel ser arredondado para baixo (x < 0.333)? (0. 333 in dizima periddica infinita). € possivel ter representacao exata? 10, Prove que todos os inteiros com 7 digitos podem ser representados com exatidao pelo float single precision. ica uma APENDICE 1 - PRECISAO DO FLOAT COM DIVISAO Perceba que as poténcias de 2 tém resultado exato, mas todos os outros sofrem com inexatidao de base e limite de bits na mantissa, #include int main(void) { (00/#inal) for(int i=0; i<=20; i++) printf("1.0/%2d=%.20f\n", i,1.0f/i); return 0; htpsiictoud uifpredu bindex phplskokKV7jaYuyLvH, sna arozie021 PDFs viewer 1/10-0.10000000149011611938 4/11=0109090909361839294434 4/12=0,08333233581686019897 107692307978a68484497 107142857462167739968, 10666665702436042 7856 105882352963089942932 105555555596947669983, 10526315793395042419) 1/20-0.05000000074505805969 APENDICE 2 - TABELA EXCESSO-7 PARA 4 BITS Para o padrao IEEE, os expoentes limites sao especiais: 0 0000 seria usado para 0.0 e 0 1111 para INF © NAN. Portanto, se tivéssemos rrepresentar expoentes entre -6 ¢ +7 (ou seja, -2°-2 € +2"°-1), em destaque abaixo. bits para o expoente, poderfamos Decimal Bindrio Complemento de 2 Excesso-15, 6 mi 4 1110 8 not w 1100 1 ott 10 010 9 1001 8 1000 ni ont on10 0101 100 oot oo10 001 0000 7 8 htpsiictoud uifpredu bindex phplskokKV7jaYuyLvH, ron

You might also like