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,
Possível Bug xHarbour/Harbour? Alguém confirma?
Moderador: Moderadores
Possível Bug xHarbour/Harbour? Alguém confirma?
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.
“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.
Possível Bug xHarbour/Harbour? Alguém confirma?
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.
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
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: .00110011001100110011001Veja a mantissa do valor de 9.2: 0010011001100110011001100110011001100110011001100110
Uma curiosidade: http://pt.wikipedia.org/wiki/Defeito_de_ponto_flutuante
Possível Bug xHarbour/Harbour? Alguém confirma?
Continuando...:
Se você pegar o seguinte exemplo em xHB/HB/Clipper/xBase:
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
Fonte de chamada em C:
E o output deste programa é:
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ê 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
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;
}
Código: Selecionar todos
0.10000000000000001
0.20000000000000001
0.29999999999999999
0.300000000000000040000000000000
Possível Bug xHarbour/Harbour? Alguém confirma?
Valeu Bencz, não entendi direito as questões matemáticas etc... mas o que importa eu entendi que é ASSIM MESMO...
Obrigado...
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.
“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.
-
Reginaldo
- 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?
Obrigado bencz, pela resposta tão bem elaborada...
Valeu!
Valeu!
Reginaldo J. Silva
Analista de Sistemas
Analista de Sistemas


