Página 1 de 1
Possível Bug xHarbour/Harbour? Alguém confirma?
Enviado: 06 Mar 2014 13:49
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,
Possível Bug xHarbour/Harbour? Alguém confirma?
Enviado: 06 Mar 2014 16:47
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
Possível Bug xHarbour/Harbour? Alguém confirma?
Enviado: 06 Mar 2014 17:00
por bencz
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
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
Possível Bug xHarbour/Harbour? Alguém confirma?
Enviado: 06 Mar 2014 18:26
por fladimir
Valeu Bencz, não entendi direito as questões matemáticas etc... mas o que importa eu entendi que é ASSIM MESMO...
Obrigado...
Possível Bug xHarbour/Harbour? Alguém confirma?
Enviado: 06 Mar 2014 18:41
por bencz
Feito!!!
qualquer duvida, pergunte!
Possível Bug xHarbour/Harbour? Alguém confirma?
Enviado: 11 Mar 2014 13:50
por Reginaldo
Obrigado bencz, pela resposta tão bem elaborada...
Valeu!