Pergunta

1) trata-se de unoverflowable?

long long v1, v2, result;
[..]
result = ((long double) v1 / v2) * 1000000LL;

1.a) Posso deixar de fora o LL em constante?E por quê.

2) Alternativamente, é esta variação sem um float ok?

long long l1, l2, result;
[..]
result = (1000000 * (v1 / v2) + v1 % v2);

2.a) Que tem mais gerais?O 1º ou este exemplo?

3) Pode flutua sempre estouro, ou apenas quebrar a " são " valores?

Foi útil?

Solução

Sim, o resultado no exemplo (1) poderia facilmente estouro se, digamos, v1 = 1000000000000000 e v2 = 1.Você não precisa do LL em que a constante porque é pequeno o suficiente para caber em um int (na maioria das implementações, em qualquer caso).

(2) Que pode estourar assim como no exemplo 1, se v1 e v2 são como eu ter dado a eles.

O primeiro exemplo é o mais caro de aritmética de ponto flutuante é mais caro que o inteiro aritmética.

(3) carros Alegóricos poderão, certamente, estouro e as consequências são dependentes de implementação.

Como Arjit apontou, você pode impedir uma sobrecarga verificando o valor de v1 antes de efectuar o cálculo.Se v1 pode ser negativo, você também precisa verificar a versão negativa, e talvez o que se segue pode ser melhor...

if ((LONG_LONG_MAX / 1000000) > V1)
{
...
}

Se você está realmente contra o limite que você pode dar a si mesmo um pouco mais de espaço, declarando as variáveis a serem unsigned.

Mais tarde - edição de corrigirem o erro apontado por Arjit.

Outras dicas

Primeiramente

  1. Se fazer um cálculo int ou longo não envolve flutuar nele. Porque seu resultado na primeira parte teria muitos valores diferentes que são quase iguais.

Porque (float) v1/v2 = ab.cdef. // onde o CDEF pode variar.

Sua segunda implementação também pode causar transbordamento se v1 = 2^15 e v2 = 1

Então, se você está procurando transbordamento e segurança, deve sempre verificar

como 2^18/constante que é 1000000 neste caso

assim

if(2^18/Constant > v1)

    result = (1000000 * (v1 / v2) + v1 % v2);

Isso seria qualquer prova de hacker.

Espero que isto ajude

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top