Pregunta

1) ¿Es esta unoverflowable?

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

1.a) ¿Puedo dejar de lado el LL de la constante? Y por qué.

2) Alternativamente es esta variación sin ok flotador?

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

2.a) que cuenta con más los gastos generales? La primera o este ejemplo?

3) Can flota cada vez desbordamiento, o simplemente envolver a los valores de los cuerdos '?

¿Fue útil?

Solución

Sí, el resultado en el ejemplo (1) podría fácilmente desbordamiento si, por ejemplo, V1 = 1000000000000000 y v2 = 1. Usted no necesita la LL en esa constante, ya que es lo suficientemente pequeño como para caber en un int (bajo la mayoría implementaciones, en cualquier caso).

(2) que puede desbordar tan bien como ejemplo 1 si v1 y v2 son como las he dado.

El primer ejemplo es más caro como aritmética de punto flotante es más caro que la aritmética de enteros.

(3) Los flotadores pueden ciertamente desbordamiento y las consecuencias son dependientes de la aplicación.

Como Arjit ha señalado, se puede evitar un desbordamiento comprobando el valor de v1 antes de realizar el cálculo. Si v1 podría ser negativo también sería necesario comprobar la versión negativa, y tal vez el siguiente podría ser mejor ...

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

Si usted está realmente con el límite que podría darse un poco más de espacio para la cabeza al declarar las variables a ser unsigned.

Más tarde - edición en error correcta señalado por Arjit

.

Otros consejos

En primer lugar

  1. si el hacer el cálculo INT o largo dont implicar flotador a la misma. Debido a que su resultado en la primera parte, tendría muchos valores diferentes que son casi iguales.

Debido (float) v1 / v2 = ab.cdef. // donde cdef puede variar.

Su segunda aplicación también puede causar desbordamiento si v1 = 2 ^ 15 y v2 = 1

por lo que si usted está buscando para el desbordamiento y la seguridad siempre debe comprobar

como 2 ^ 18 / constante que es 1000000, en este caso

so

if(2^18/Constant > v1)

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

Esto sería ninguna prueba truco.

Esperamos que esto ayude

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top