NormalizarDuplo paradoxo - página 11

 
transcendreamer:

O que me incomoda é que quando calculo um número fracionário, o normalizo, o escrevo em uma variável, depois o leio e o normalizo novamente, recebo caudas

por exemplo

basis[0]=NormalizeDouble(sum_A,2);

GlobalVariableSet("Equity-"+portfolio_id,basis[0]); 

...

current=NormalizeDouble(GlobalVariableGet("Equity-"+portfolio_id),2);

text = "Positions synchronized at " + current + " for portfolio: " + portfolio_name;

if(!automatic) MessageBox(text,""); else Print(text);

Agora eu mudei para

text = "Positions synchronized at " + DoubleToStr(current,2) + " for portfolio: " + portfolio_name;

if(!automatic) MessageBox(text,""); else Print(text);

e não parece haver caudas, ufa, ufa, ufa...

Já escrevi, vou repetir - alguns números não existem em binário. Não há 0,1, não há 0,3 e muitos outros. Não importa quantas vezes você escreva o dobro val = NormalizeDouble(0,1434, 1), você nunca receberá 0,1 só porque não existe tal número.

Por exemplo, os números são representados da seguinte forma:

0,1 = 0,100000000000000000001
0,2 = 0,20000000000000001
0,3 = 0,2999999999999999999999999
0,4 = 0,40000000000000000000002
0,6 = 0,59999999999999999999998

mas
0,125 = 0,125
0,25 = 0,25
0,5 = 0,5

Se isto for muito perturbador, você precisa arredondar ou escrever sua própria bicicleta para representar números fracionários (pode haver algumas bibliotecas, não interessadas) que não usarão o fpu.

E não são adicionados rabos durante a conversão em cordel, eles estão lá inicialmente.

 
transcendreamer:

por isso resolvi minha pergunta, podemos encerrar o assunto

solução: você tem que forçar o arredondamento, mesmo após a normalização

Solução errada. Ao arredondar, você tem que multiplicar, arredondar, dividir. Após a última divisão, o número não seráormalizado.
 
transcendreamer:

muito possivelmente... mas em termos do resultado final - há caudas!

...

Sem rabos após a normalização.
 
Integer:
Não há caudas após a normalização.

Acho que você está enganando o homem. O que você quer dizer com "não há rabos após a normalização"? Não pode haver caudas somente na corda que recebemos de um número e arredondamos o valor (arredondado já na corda, não em dobro). Mas há caudas após a NormalizeDouble().

 
Integer:
Solução errada. Ao arredondar, você tem que multiplicar, arredondar, dividir. Após a última divisão, o número será não-normalizado.

O que você quer dizer com "normalização"? Stringo estava dizendo aqui que o algoritmo é algo assim:

double NormalizeDouble(double val, int digits)
{
    val *= 10 ^ digits
    округляем к ближайшему целому
    val /= 10 ^ digits
    return val
}
 
pavlick_:

Acho que você está enganando o homem. O que você quer dizer com "não há rabos após a normalização"? Não pode haver caudas somente na corda que recebemos de um número e arredondamos o valor (arredondado já na corda, não em dobro). Mas depois de NormalizeDouble() há caudas.

Bem, se você gosta de acreditar que eu estou enganando alguém, acredite em mim. Já vi todo tipo de pessoas aqui, não me surpreenderei com sua posição "de princípio".
 
pavlick_:

O que você quer dizer com "normalização"? Stringo disse aqui que o algoritmo é algo parecido com isto:

Seria muito mais interessante o que você quer dizer com "normalização".
 
Integer:
Estou lhe fazendo uma pergunta específica e você está derramando água sobre mim. É meio normal explicar e argumentar seu ponto de vista.
 
pavlick_:
Estou lhe fazendo uma pergunta específica e você está derramando água sobre mim. Como é normal explicar e argumentar seu ponto de vista?
Ler os livros didáticos e a documentação em voz alta, ou o quê? Ou leia o dicionário em voz alta, sobre a palavra "aproximadamente"?
 
Integer:
Ler os livros didáticos e a documentação em voz alta ou o quê? Ou leia o dicionário em voz alta, sobre a palavra "aproximadamente"?
É claro que não temos nada a conversar. E é melhor ficar fora das conversas se não for responsável por suas palavras.