2011-12-10 19 views
6

Sto provando a produrre un float dividendo due int s nel mio programma. Ecco quello che mi aspettavo:Obiettivo c divisione di due interi

1/120 = 0,00833

Ecco il codice che sto utilizzando:

float a = 1/120; 

Tuttavia non mi dà il risultato che ci si aspetta . Quando stampo fuori ottengo il seguente:

inf 
+3

Come si stampa il valore float su console? A meno che non si stia stampando NSLog (@ "inf"); o printf ("inf"); non è possibile ottenere inf stampato su console. – 0x8badf00d

+0

@ 0x8badf00d: Sì, è possibile (probabilmente): 'printf ("% g \ n ", 1.0/0.0);' –

risposta

11

fare il seguente

float a = 1./120. 
+1

Personalmente, trovo '1.0/120.0' più chiaro di' 1./120'. –

7

È necessario specificare che si desidera utilizzare matematiche in virgola mobile.

Ci sono alcuni modi per farlo:

  • Se siete realmente interessati a dividere due costanti, è possibile specificare che si desidera matematica in virgola mobile, rendendo il prima costante un galleggiante (o doppia). Tutto ciò che serve è un punto decimale.

    float a = 1./120; 
    

    Non è necessario per rendere la seconda costante un galleggiante, anche se non fa male nulla.

  • Francamente, questo è piuttosto facile da mancare quindi suggerirei di aggiungere uno zero finale e un po 'di spaziatura.

    float a = 1.0/120; 
    
  • Se si vuole veramente fare i conti con una variabile intera, è possibile digitare cast:

    float a = (float)i/120; 
    
5
float a = 1/120; 
float b = 1.0/120; 
float c = 1.0/120.0; 
float d = 1.0f/120.0f; 

NSLog(@"Value of A:%f B:%f C:%f D:%f",a,b,c,d); 

Output: Value of A:0.000000 B:0.008333 C:0.008333 D:0.008333 

Per variabile float un: int/INT rendimenti intero che stai assegnando a float e stampandolo in modo 0.0000000

Per variabile float b: float/int produce float, assegnando a fl avena e stamparlo 0,008333

Per variabile float c: i rendimenti del galleggiante/galleggiante galleggiano, così 0,008333

ultimo è più preciso galleggiante. I precedenti sono di tipo double: tutti i valori in virgola mobile sono memorizzati come doppi tipi di dati, a meno che il valore sia seguito da una 'f' per specificare specificatamente un float piuttosto che come un double.

3

In C (e quindi anche in Objective-C), le espressioni vengono quasi sempre valutate indipendentemente dal contesto in cui appaiono.

L'espressione 1/120 è una divisione di due operandi int, quindi produce un risultato int. La divisione intera tronca, quindi 1/120 produce 0. Il fatto che il risultato sia utilizzato per inizializzare un oggetto float non modifica il modo in cui viene valutato 1/120.

Questo può essere controintuitivo, a volte, soprattutto se si è abituati al modo in cui i calcolatori generalmente funzionano (di solito memorizzano tutti i risultati in virgola mobile).

Come hanno detto le altre risposte, per ottenere un risultato vicino a 0.00833 (che non può essere rappresentato esattamente, BTW), è necessario eseguire una divisione in virgola mobile anziché una divisione in interi, eseguendo uno o entrambi degli operandi a virgola mobile. Se un operando è a virgola mobile e l'altro è un numero intero, l'operando intero viene convertito prima in virgola mobile; non esiste un virgola mobile diretto per operazione di divisione intera.

Si noti che, come dice il commento di @ 0x8badf00d, il risultato dovrebbe essere 0. Qualcos'altro deve essere sbagliato perché il risultato stampato sia inf. Se puoi mostrarci altro codice, preferibilmente un piccolo programma completo, possiamo aiutarti a capirlo.

(Ci sono linguaggi in cui la divisione intera produce un risultato in virgola mobile. Anche in quei linguaggi, la valutazione non è necessariamente influenzata dal suo contesto. Python versione 3 è uno di questi linguaggi; C, Objective-C e Python versione 2 no.)