Valori float fittizi per forzare le operazioni in virgola mobile

3

È normale usare espressioni come:

x/60.0

per forzare una divisione in virgola mobile quando x è un numero intero in lingue che non hanno operatori distinti per la divisione intero e decimale.

È un idioma accettato o è preferibile eseguire il cast di x su un tipo a virgola mobile?

Credo che sia un linguaggio sintetico e chiaro - potrebbe essere l'intenzione di mostrare meno chiaramente di un cast esplicito, ma è più conciso e più facile da leggere. Penso che sia meno hack-ish di x + "" da convertire in stringa o x+0.0 da convertire in virgola mobile (dato che non ci sono inutili "NOOP").

Pensieri?

Álex

    
posta alex 16.07.2012 - 18:09
fonte

1 risposta

7

Il risultato del reso sarà specifico per la lingua in base al modo in cui la lingua gestisce le conversioni implicite.

Detto questo, se il tuo linguaggio di scelta supporterà il ritorno di un float da quella conversione implicita, allora sì, il tuo esempio è un modo abbastanza comune di innescare l'aritmetica del punto float. È veloce, pulito e chiaro.

Alcune lingue richiedono il cast esplicito, quindi la norma in questi casi sarebbe ovviamente il cast esplicito.

Aggiornamento: Alex ha chiesto:

would you prefer x/60.0 or float(x)/60? Why?

E la mia preferenza è per il primo, come questo esempio spiegherà. Tieni presente che i miei commenti sono ancora indirizzati a lingue che consentono la conversione implicita. Le lingue che richiedono una conversione esplicita non rientrano nell'ambito di applicazione della risposta.

int x = 65;
float y = 0.0;

y = x / 10.0;  //will yield 6.5

vs.

int x = 65;
float y = 0.0;

y = (float) x / 10.0;  //will still yield 6.5

Perché?

  • Il cast implicito è quello che mi aspetterei che il codice faccia in primo luogo. Quando eseguo mentalmente i calcoli prima di dattilografarli, la mia mente cambia tra Integer e Reals senza preoccuparsi di ciò. In questo caso, mi aspetto che il compilatore sia in grado di fare lo stesso.
  • Il cast esplicito confonde il codice. Leggendolo ad alta voce, ottengo "y uguale a float x diviso per 10" invece di "y equivale x diviso per 10." L'inserimento del cast esplicito interrompe il mio schema di pensiero durante la lettura del codice.
  • E mentre questa potrebbe essere solo la mia coscienza sporca, ho sempre la sensazione di fare qualcosa di sbagliato quando ho bisogno di un cast esplicito. Mi sento come se stessi dicendo al compilatore "Normalmente non lo faresti perché è sbagliato, ma ti giuro che in questo caso va bene. Davvero, credimi, ok?" (Sono d'accordo, potrei usare qualche terapia sul problema). Il compilatore dovrebbe essere abbastanza intelligente da consentire la conversione o generare un errore in caso di perdita di dati.
  • Infine, quando si aggiunge un cast esplicito non necessario, c'è la possibilità di introdurre un bug più avanti nella vita del codice. Se uno dei tipi di variabili cambia, il cast esplicito può consentire la compilazione di qualcosa che in realtà non dovrebbe avere. Certo, è abbastanza raro ma può essere molto difficile da cacciare.
risposta data 16.07.2012 - 18:47
fonte

Leggi altre domande sui tag