Kolem plavou na funkce v C++ se zdá změnit přesnost

0

Otázka

To je velmi noob dotaz, ale jsem zvědavý, proč za to: -Pokud jsem debug následující kód jazyka C++:

void floatreturn(float i){
      //nothing
}

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

Sledování prošel hodnotu, to se zdá být 23.9759998 při vstupu floatreturn. Výsledkem je, že jakékoli zpracování hodnota funkce bude vyžadovat, aby ručně vyladit přesnost. Je pro to nějaký důvod, a nějaký způsob, jak se tomu vyhnout?

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

Nejlepší odpověď

0

Problém se stalo předtím, než floatreturn(a);.
Stalo se to v float a = 23.976;
floatreturn(a); je irelevantní.

Tam je asi 2^32 různých hodnot, které float může kódovat přesně. 23.976 není jeden z nich. Nejbližší encodable float je o 23.9759998...

Aby se zabránilo, použijte hodnoty, které mohou přesně kódovat jako float nebo tolerovat, že v blízkosti - cca 1 díl 224

2021-11-24 16:43:03

Díky Markovi za odkaz a chux pro stručnou odpověď.
mv_p

Jen jeden další vzdělávací bod pro mě: proč cout výchozí přesností na 3 desetinná místa, když jsme dotisk proměnné bez nastavení přesnosti pro výstup? Chápu, že skladování plováku se vždy vrátit na nejbližší binární float možné, a že cout je zaokrouhlování.
mv_p

@mv_p Co bylo přesnou výstupní jsi viděl?
chux - Reinstate Monica

s jednoduché 'float x = 23.976; cout << x;' vidím, "23.976"
mv_p

V jiných jazycích

Tato stránka je v jiných jazycích

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