Float'ı C++ ' daki bir işleve geçirmek hassasiyeti değiştiriyor gibi görünüyor

0

Soru

Bu çok noob bir soru, ama bunun arkasındaki nedeni bilmek merak ediyorum: -Aşağıdaki C++ kodunda hata ayıklarsam:

void floatreturn(float i){
      //nothing
}

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

Geçirilen değeri izleme a, floatreturn girerken 23.9759998 gibi görünüyor. Sonuç olarak, işlevdeki değerin herhangi bir şekilde işlenmesi, hassasiyeti manuel olarak ayarlamayı gerektirir. Bunun bir nedeni var mı ve bundan kaçınmanın bir yolu var mı?

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

En iyi cevabı

0

Sorun daha önce de oldu floatreturn(a);.
Bu oldu float a = 23.976;
floatreturn(a); alakasız.

Yaklaşık 2^32 farklı değer vardır float tam olarak kodlayabilir. 23.976 onlardan biri değil. En yakın kodlanabilir float yaklaşık 23.9759998'dir...

Bunu önlemek için, tam olarak kodlayabilecek değerleri kullanın. float ya da yakın olmaya tahammül edin-2 24'te yaklaşık 1 kısım

2021-11-24 16:43:03

Bağlantı için Mark'a ve özlü cevap için chux'a teşekkürler.
mv_p

Benim için sadece bir eğitim noktası daha: çıktı için hassasiyeti ayarlamadan değişkeni yeniden yazdırırsak, cout neden varsayılan olarak 3 ondalık kesir hassasiyetine sahiptir? Şamandırayı depolamanın her zaman mümkün olan en yakın ikili şamandırayı döndüreceğini ve cout'un yuvarlandığını anlıyorum.
mv_p

@mv_p Gördüğünüz tam çıktı neydi?
chux - Reinstate Monica

basit bir 'float x = 23.976; cout < < x;' ile "23.976" görüyorum.
mv_p

Diğer dillerde

Bu sayfa diğer dillerde

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