Velocidade de execução das funções ceil(),round(),floor() - página 3

 
Nikolai Semko:

Sim, mas se:

então está tudo bem.

Resta saber se está tudo bem para qualquer número x
 

A100:

void OnStart()
{
        Print( (int)(3.0001 + 0.999999999999999)); //все равно 4
        Print( floor(3.00001));                    //3
}




Eu não entendo. Qual é o problema?

 
A100:
Resta saber se estará tudo bem para qualquer número x

É claro que não vai...

Afinal de contas, se isto acontecer:

double x=3;
x=x+0.1;
x=x+0.1;
x=x+0.1;
x=x+0.1;
if (x!=3.4) Print("oppps..."); // oppps...

então, as perguntas não são nem para mim nem para esta idéia.

 
Nikolai Semko:
Qual é o problema?
void OnStart()
{
        double d =  16 + 0.999999999999999;
        Print( (int)(d + 0.999999999999999)); //18
        Print( (int)ceil( d ));               //17
}
 
A100:

ver meu post anterior

 
Nikolai Semko:
então, as perguntas não são para mim, nem para esta idéia.
piso(), teto(), redondo() estão lá para evitar perguntas
 

Penso que todas estas falhas acima estão além do escopo do uso prático desta solução para acelerar o arredondamento de inteiros positivos, porque poucas pessoas precisam de precisão no nível de 16 dígitos. E estes insetos surgem de todos os tipos de transbordamentos nos níveis de pontos do próprio compilador.

 
A100:
Piso(), teto(), redondo() existem para esse fim - por isso não há dúvidas

Não estou proibindo que você as utilize. Você é bem-vindo a usá-los. Eu mesmo os usarei. Mas se eu criar um algoritmo onde a velocidade é importante, usarei esta variante de arredondamento levando em conta todas as nuances deste método. Penso que será útil para outros programadores saberem sobre a existência desta alternativa. A discussão é exatamente o que precisamos saber sobre as nuances deste método de arredondamento. Muito obrigado por isso. Eu não estou certo?

 
Nikolai Semko:

DBL_MIN eDBL_EPSILON não funcionam - muito pequenos. Talvez faça sentido deixar 0,99999999999999999999 (16 noves - o número máximo de dígitos após o ponto decimal em dobro)

Portanto, DBL_EPSILON tem 16 casas decimais:2,2204460492503131e-016.

No seu caso, você realmente recebe um, pois a diferença é de apenas 1e-16, que é 2 vezes menor que o epsilon.

 
Alexey Navoykov:

Então DBL_EPSILON tem 16 casas decimais:2,2204460492503131e-016

E no seu caso você realmente recebe um, pois a diferença é apenas 1e-16, o que é 2 vezes menor que o epsilon.


Sim, eu entendo isso, mas não funciona. Acontece que também não funciona com 16 noves (estranho, parecia funcionar antes). Funciona apenas com 15 noves.

double x=3;
int Y=(int)ceil(x);
Print(Y);                         // 3
Y=(int)(x+0.999999999999999); 
Print(Y);                         // 3  (15 9-ток)
Y=(int)(x+0.9999999999999999);
Print(Y);                         // 4  (16 9-ток)
Y=(int)(x+1-DBL_EPSILON);
Print(Y);                         // 4