Possível Bug xHarbour/Harbour? Alguém confirma?

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Possível Bug xHarbour/Harbour? Alguém confirma?

Mensagem por fladimir »

Pessoal,

Alguém já passou por problema parecido com casas decimais no xHarbour/Harbour?

Exemplos:

1) Com o número 9.3:
Se pedir para mostrar com str(9.3,50,20), me mostra: 9.30000000000000100000

2) Com o número 9.2:
Se pedir para mostrar com str(9.2,50,20), me mostra: 9.19999999999999900000

O comando SET DECIMALS não interfere em nada....

Alguém sabe me dizer se é um problema do xHarbour/Harbour?

Obrigado pela atenção,
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Possível Bug xHarbour/Harbour? Alguém confirma?

Mensagem por bencz »

Jovem, boa tarde!!!

Isso não é um problema do xHB ou hb, isso ocorre com qualquer linguagem de programação que funcione em COMPUTADORES x32, x64.... e enfins, isso ocorre por causa do limite binario do tipo float/double ( no caso double ).
De uma olhada nisso: http://docs.oracle.com/cd/E19957-01/806 ... dberg.html
http://pt.wikipedia.org/wiki/Ponto_flutuante


O problema está na mantisa do numero, pois, o numero 3, como por exemplo, é um numero PRIMO E NÃO É FATOR DE 10, logo, não tem como fazer a representação decimal correta destes valores, isso ocorre por que quando você faz a divisão de umnumero que não é fator de sua base, o numero já não é preciso.
Por exemplo:

Uma fração, como 1/5 (0,2) deve ser representado por uma soma de frações cujos denominadores são potências de 2. Aqui está a saída de um programa que subtrai cada fração sucessiva de 0,2 e mostra cada restante. Na verdade, um valor exato não é encontrado depois de criar os 23 bits de mantissa. O resultado, no entanto, tem uma precisão de sete dígitos. As linhas em branco são para as frações que eram demasiado grande para ser subtraído do valor restante do número. O bit 1, por exemplo, era igual a 0,5 (1/2), o que não poderia ser subtraído 0,2.

Código: Selecionar todos

     starting:   0.200000000000

 1
 2
 3   subtracting 0.125000000000
     remainder = 0.075000000000
 4   subtracting 0.062500000000
     remainder = 0.012500000000
 5
 6
 7   subtracting 0.007812500000
     remainder = 0.004687500000
 8   subtracting 0.003906250000
     remainder = 0.000781250000
 9
10
11   subtracting 0.000488281250
     remainder = 0.000292968750
12   subtracting 0.000244140625
     remainder = 0.000048828125
13
14
15   subtracting 0.000030517578
     remainder = 0.000018310547

16   subtracting 0.000015258789
     remainder = 0.000003051758
17
18
19   subtracting 0.000001907349
     remainder = 0.000001144409
20   subtracting 0.000000953674
     remainder = 0.000000190735
21
22
23   subtracting 0.000000119209
     remainder = 0.000000071526


Mantissa: .00110011001100110011001
Compare com a conversão: http://www.binaryconvert.com/result_dou ... =057046050
Veja a mantissa do valor de 9.2: 0010011001100110011001100110011001100110011001100110


Uma curiosidade: http://pt.wikipedia.org/wiki/Defeito_de_ponto_flutuante
Imagem
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Possível Bug xHarbour/Harbour? Alguém confirma?

Mensagem por bencz »

Continuando...:

Se você pegar o seguinte exemplo em xHB/HB/Clipper/xBase:

Código: Selecionar todos

function main()
   ? (0.2+0.1) == 0.3
   return nil
você ira notar que o output disso é .F., pois em memoria, esses numeros não são exatamente o que você está efetivamente vendo!!!
Você pode fazer este teste em qualquer linguagem, você vai sempre obter o mesmo erro!!!

http://effbot.org/pyfaq/why-are-floatin ... curate.htm

Veja mais este exemplo que fiz em C + Assembly ( nasm )
soma.asm

Código: Selecionar todos

         global  _sum
        
        section .text
_sum:
        mov     edx, [esp+4]            
        mov     ecx, [esp+8]           
        fldz                            
        cmp     ecx, 0                  
        jle     done
next:
        fadd    qword [edx]             
        add     edx, 8                  
        dec     ecx                    
        jnz     next                    
done:
        ret                            
Fonte de chamada em C:

Código: Selecionar todos

#include <stdio.h>

double sum(double[], unsigned);

int main() {
    double test[] = { 0.1, 0.2 };

	printf("%20.17f\n", 0.1);
	printf("%20.17f\n", 0.2);
	printf("%20.17f\n", 0.3);
    printf("%20.30f\n", sum(test, 2));
    return 0;
}
E o output deste programa é:

Código: Selecionar todos

 0.10000000000000001
 0.20000000000000001
 0.29999999999999999
0.300000000000000040000000000000
Imagem
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Possível Bug xHarbour/Harbour? Alguém confirma?

Mensagem por fladimir »

Valeu Bencz, não entendi direito as questões matemáticas etc... mas o que importa eu entendi que é ASSIM MESMO...

Obrigado...
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Possível Bug xHarbour/Harbour? Alguém confirma?

Mensagem por bencz »

Feito!!!
qualquer duvida, pergunte!
Imagem
Reginaldo
Usuário Nível 2
Usuário Nível 2
Mensagens: 71
Registrado em: 14 Jul 2004 08:06
Localização: Lagoa da Prata - MG
Contato:

Possível Bug xHarbour/Harbour? Alguém confirma?

Mensagem por Reginaldo »

Obrigado bencz, pela resposta tão bem elaborada...
Valeu!
Reginaldo J. Silva
Analista de Sistemas
Responder