2016-03-01 51 views
5

Ho una domanda che potrebbe risparmiare un sacco di tempo per molte persone il debug ...C: Sottrarre doppia da intero

Data una funzione:

void my_func(double value) 

C'è qualche differenza tra i 2 seguente linee di codice?

double my_value = 1 - value; 

e

double my_value = 1.0 - value; 

Vale a dire dato che value è double, se utilizzo 1 - value, posso essere sicuro che il risultato sarà il numero reale corretto, come quando si utilizza 1.0 - value?

risposta

11

Non c'è differenza. Per sottrarre uno double da un int, lo int deve essere promosso a double. Personalmente preferisco usare 1.0 perché penso che sia più chiaro che non è una sottrazione di interi. Ma è puramente un problema di stile.

+0

Grazie mille per la risposta chiara e dettagliata! – vav

+1

Penso che "rende più chiaro" è _ ** molto ** importante_, perché _someone_ verrà dopo e vedrà '1 - valore' e sarà confuso. Inoltre, se 'double my_value = 1 - value;' è un modo sotto la dichiarazione della funzione 'void my_func (double value)' potresti dover guardare indietro per vedere che tipo 'value' in realtà è capire la dichiarazione. Vorrei _always_ usare '1.0 - value'. –

+0

@StephenP, sono totalmente d'accordo con te – vav

3

Sì, si presuppone correttamente, ma per le espressioni più complesse, è necessario prestare molta attenzione alla combinazione di valori interi e in virgola mobile. Ad esempio, il codice alla ricerca innocenti:

double x = 1/2; 

memorizzerà 0-x perché il calcolo è fatto su int valori e il risultato viene convertito in double.

+0

Grazie mille – vav

1

Se un operando di un operatore aritmetico è a virgola mobile, il calcolo viene eseguito in virgola mobile in virgola mobile. Il calcolo viene eseguito in doppio, a meno che entrambi gli operandi non siano a virgola mobile, nel qual caso il calcolo viene eseguito in virgola mobile.

+2

lunga doppia se uno degli operandi è lungo doppio. – gnasher729

+0

Non ho abbastanza reputazione per l'up-voting, quindi mi limito a commentare grazie a tutti quelli che mi rispondono bene – vav

+0

@ gnasher729 "long double" è rilevante solo quando non viene utilizzata l'istruzione SSE per la precisione in virgola mobile estesa. Se non è possibile controllare se le istruzioni 8087 Coprocessore (80 bit precise) o SSE (precisione a 64 bit) vengono utilizzate, non si conosce la precisione corrente del risultato. Se si usa SSE, "long double" sarà uguale a "double". – cwschmidt

3

Sei corretto. L'operatore - lavora su oggetti dello stesso tipo. C'è una conversazione di tipo implicita qui, e l'int è convertito in doppio.

Si noti che questo può essere fonte di bug quando si mischiano tipi firmati e non firmati.

+0

Grazie per la risposta – vav

+0

Felice di aiutare :) – DevShark

3

Nel tuo esempio entrambi saranno comportarsi allo stesso modo

Vale a dire dato che il valore è doppio, se uso 1 - value, posso sentirmi sicuro che il risultato sarà il numero reale corretto, come quando si usa 1.0 - value?

Con 1.0 - value inoltre, non è possibile garantire che sia corretto numero reale. Verificare alcuni documenti per Floating-Point Arithmetic.