2010-04-12 22 views
5

Quiero implementar la función entera más grande. [La "función mayor entero" es una quitestandard name por lo que también se conoce como la función del suelo.]C++ integer floor function

int x = 5/3; 

Mi pregunta es con mayor número podría haber una pérdida de precisión como 5/3 produciría un doble ?

EDIT: Greatest función entera es entero menor o igual a X. Ejemplo:

4.5 = 4 
4 = 4 
3.2 = 3 
3 = 3 

Lo que yo quiero saber es 5/3 va a producir un doble? Porque si así tendré pérdida de precisión al convertir a int.

Espero que esto tenga sentido.

+2

lo que es más funciones de números enteros? – Andrey

+0

Tenga en cuenta que en C y C++, el operador '/' que actúa sobre enteros siempre devuelve un resultado entero. Más allá de eso, creo que necesitas ser más específico acerca de lo que quieres --- ¿tu función va a devolver el mayor entero ** menos tham ** un número dado? ¿Qué tipo va a tener ese número? Si es un 'float' o' double', tendrá pérdida de precisión independientemente. Si se trata de un modelo autóctono que modela los números ** racionales **, puede evitar la pérdida de precisión. – Pillsy

+4

¡Es una función que devuelve el entero * más grande *! Creo que el más grande es 1,000,001 –

Respuesta

5

Perderá la porción fraccionaria del cociente. Entonces, sí, con números mayores tendrá más precisión relativa, como en comparación con 5000/3000. Sin embargo, 5/3 devolverá un número entero, no un doble. Para forzarlo a dividir como doble, encasille el dividendo como (double)5/3.

+0

Gracias todo lo que necesitaba saber. – Thomas

1

5/3 siempre producirá 1 (un número entero), si lo hace 5.0/3 o 5/3.0 el resultado será un doble.

0

Dado que en C y C++, como han dicho otros,/es una división entera, devolverá un int. en particular, devolverá el piso de la doble respuesta ... (C y C++ siempre truncan) Entonces, básicamente 5/3 es exactamente lo que quiere.

Se puede conseguir un poco raro en los negativos como -5/3 => -2, que puede o no ser lo que quieres ...

+4

Pero si eres inteligente, puedes usar negativos para implementar el entero 'ceil()' ... –

+0

heh this is true. –

+1

Es ** no ** cierto que la división entera devuelve la palabra! El punto clave (que a menudo se pasa por alto) es cómo se tratan los números * negativos *. Aquí -9/4 == -2 pero piso (-9.0/4) == -3.0 – Ichthyo

2

La división entera da resultados enteros, por lo que 5/3 es 1 y 5% 3 es 2 (el operador restante). Sin embargo, esto no necesariamente se cumple con los números negativos. En el estándar original de C++, -5/3 podría ser -1 (redondeando hacia cero) o -2 (el piso), pero se recomendó -1. En el último borrador de C++ 0B (que es casi seguro que está muy cerca del estándar final), es -1, por lo que encontrar el piso con números negativos es más complicado.

0

Hasta donde yo sé, no hay una función predefinida para este propósito. Puede ser que sea necesario utilizar una función de este tipo, si por alguna razón cálculos de punto flotante están fuera de cuestión (por ejemplo int64_t tiene una precisión mayor que double puede representar sin error)

podríamos definir esta función de la siguiente manera:

#include <cmath> 

inline long 
floordiv (long num, long den) 
{ 
    if (0 < (num^den)) 
    return num/den; 
    else 
    { 
     ldiv_t res = ldiv(num,den); 
     return (res.rem)? res.quot-1 
         : res.quot; 
    } 
} 

la idea es usar la División de enteros normales, pero ajustar para obtener resultados negativos para que coincida con el comportamiento de la función double floor(double). El objetivo es truncar siempre hacia el siguiente entero inferior, independientemente de la posición del punto cero. Esto puede ser muy importante si la intención es crear intervalos de tamaño uniforme.

mediciones de tiempo muestran que esta función sólo crea aquí una pequeña sobrecarga en comparación con el floor función incorporada / operador, pero por supuesto el punto flotante basa es significativamente más rápido ....