2010-04-12 20 views
5

Voglio implementare la più grande funzione intera. [La "funzione più grande intero" è una quitestandard name per ciò che è noto anche come la funzione di pavimento.]C++ numero intero funzione

int x = 5/3; 

La mia domanda è con numero maggiore potrebbe esserci una perdita di precisione 5/3 produrrebbe un doppio ?

EDIT: Greatest funzione integer è intero minore o uguale a X. Esempio:

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

Quello che voglio sapere è 5/3 andando a produrre una doppia? Perché se così avrò una perdita di precisione durante la conversione in int.

Spero che questo abbia senso.

+2

ciò che è più grande funzione intero? – Andrey

+0

Si noti che in C e C++, l'operatore '/' che agisce su interi restituisce sempre un risultato intero. Oltre a ciò, penso che tu debba essere più specifico su ciò che vuoi --- la tua funzione restituirà il più grande numero intero ** less tham ** un dato numero? Che tipo avrà quel numero? Se è un 'float' o' double', avrai una perdita di precisione a prescindere. Se si tratta di un tipo sviluppato in casa che modella i numeri ** razionali **, è possibile evitare la perdita di precisione. – Pillsy

+4

È una funzione che restituisce il numero * massimo * mai visto! Credo che il più grande sia 1,000,001 –

risposta

5

Perderai la parte frazionaria del quoziente. Quindi sì, con numeri maggiori avrai una precisione relativa maggiore, ad esempio rispetto a 5000/3000.

Tuttavia, 5/3 restituirà un numero intero, non un doppio. Per forzarlo a dividere come double, typecast il dividendo come (double)5/3.

+0

Grazie tutto quello che dovevo sapere. – Thomas

1

5/3 produrrà sempre 1 (un numero intero), se si fa 5,0/3 o 5/3,0 il risultato sarà un doppio.

0

Poiché in C e C++, come altri hanno detto,/è una divisione intera, restituirà un int. in particolare, restituirà il piano della risposta doppia ... (C e C++ troncano sempre) Quindi, in pratica 5/3 è esattamente quello che vuoi.

Si può ottenere un po 'strano in negativo come -5/3 => -2, che può o non può essere quello che vuoi ...

+4

Ma se sei intelligente, puoi usare i negativi per implementare integer 'ceil()' ... –

+0

heh questo è vero. –

+1

È ** non ** vero che la divisione intera restituisce il pavimento! Il punto chiave (spesso trascurato) è il modo in cui vengono trattati i numeri * negativi *. Qui -9/4 == -2 ma floor (-9.0/4) == -3.0 – Ichthyo

2

divisione Integer dà risultati interi, in modo da 5/3 è 1 e 5% 3 è 2 (l'operatore restante). Tuttavia, questo non vale necessariamente con numeri negativi. Nello standard C++ originale, -5/3 potrebbe essere o -1 (arrotondando verso lo zero) o -2 (il pavimento), ma -1 è stato raccomandato. Nell'ultima bozza di C++ 0B (che è quasi certamente molto vicina allo standard finale), è -1, quindi trovare la parola con numeri negativi è più coinvolgente.

0

Per quanto ne so, non esiste una funzione predefinita per questo scopo. Potrebbe essere necessario utilizzare tale funzione, se per qualche motivo calcoli a virgola mobile sono fuori discussione (es int64_t ha una precisione superiore double può rappresentare senza errori)

potremmo definire questa funzione come segue:

#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; 
    } 
} 

L'idea è di utilizzare la normale divisione di interi, ma regolare i risultati negativi in ​​modo che corrispondano al comportamento della funzione double floor(double). Il punto è di troncare sempre verso il successivo numero intero inferiore, indipendentemente dalla posizione del punto zero. Questo può essere molto importante se si intende creare intervalli di dimensioni regolari.

misurazioni Timing dimostrano che questa funzione qui crea solo un piccolo sovraccarico rispetto alla funzione built-in / operatore, ma naturalmente alla base della virgola mobile floor è significativamente più veloce ....