Passando galleggiante per una funzione in C++ che sembra cambiare di precisione

0

Domanda

Questa è una domanda niubba, ma sono curioso di sapere il motivo dietro a questo: -Se il debug di codice C++ seguente:

void floatreturn(float i){
      //nothing
}

int main(){
    float a = 23.976;
    floatreturn(a);
    return 0;
}

Monitoraggio il valore passato di un, sembra essere 23.9759998 quando si entra in floatreturn. Come risultato, ogni trasformazione del valore in funzione richiederebbe di modificare manualmente la precisione. C'è una ragione per questo, e qualche modo per evitarlo?

c++ floating-point
2021-11-24 04:32:57
1

Migliore risposta

0

Il problema è successo prima floatreturn(a);.
E ' accaduto a float a = 23.976;
floatreturn(a); è irrilevante.

Ci sono circa 2^32 valori che float è possibile codificare esattamente. 23.976 non è uno di loro. La più vicina encodable float è di circa 23.9759998...

Per evitare di utilizzare i valori che può esattamente codificare come un float o tollerare di essere vicino - a circa 1 parte 224

2021-11-24 16:43:03

Grazie Marco per il link e chux per la risposta in breve.
mv_p

Poco più di un punto educativo per me: perché cout predefinito per una precisione di 3 decimali se riportiamo la variabile senza l'impostazione di precisione per l'uscita? Credo che la memorizzazione di galleggiante restituirà sempre più vicino binario float possibile, e che cout è di arrotondamento.
mv_p

@mv_p Quello che era l' esatta uscita che hai visto?
chux - Reinstate Monica

con un semplice 'float x = 23.976; cout << x;" vedo "23.976"
mv_p

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................