ส่งลอยเพื่อนฟังก์ชันใน C++ดูเหมือนจะเปลี่ยนความแม่นยำ

0

คำถาม

นี่มันค่อน noob คำถามแต่ฉันสงสัยอยากรู้เหตุผลอยู่เบื้องหลังเรื่องนี้: -ถ้าฉันการดีบั๊กต่อไปนี้ C++รหัส:

void floatreturn(float i){
      //nothing
}

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

การติดตามดูผ่านค่าของมันดูเหมือนจะเป็นอย่างนั้ 23.9759998 เมื่อเข้าสู่ floatreturn. เป็นผลให้มีการประมวลผลของค่าอยู่ในฟังก์ชันจะต้องการให้ด้วยตนเอง tweak งความแม่นยำ มีเหตุผลสำหรับเรื่องนี้และมีทางที่จะหลีกเลี่ยงมัน?

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

คำตอบที่ดีที่สุด

0

ปัญหาเกิดขึ้นก่อน floatreturn(a);.
มันเกิดขึ้นตอน float a = 23.976;
floatreturn(a); คือไม่มีความเกี่ยวข้องกัน

มันมีเรื่อง 2^32 ต่างออกค่าของมัน float สามารถทำการเข้ารหัสแน่นอน 23.976 คือไม่ใช่หนึ่งในพวกนั้นหรอก ทีใกลทีสุดหางออกไป encodable float เป็นเรื่อง 23.9759998...

เพื่อหลีกเลี่ยง,ใช้ค่าที่สามารถทำการเข้ารหัสกันแน่ที่เป็น float หรือทนกับการปิด-เรื่อง 1 นส่วนหนึ่งใน 224

2021-11-24 16:43:03

ขอบคุณมาร์สำหรับการเชื่อมต่อและ chux สำหรับ concise คำตอบ
mv_p

ก็แค่อีกหนึ่งการศึกษาประเด็นสำหรับฉัน:ทำไม cout ค่าปริยายไปเป็นจำนวนทศนิยมของ 3 อีเมล์ถ้าพวกเรา reprint งตัวแปรโดยไม่มีการตั้งค่าจำนวนทศนิยมสำหรับการส่งออก? ฉันเข้าใจว่าจัดเก็บปลอยจะกลับมาที่ใกล้เคียงที่สุดที่ฐานสองปล่อยลอยได้และนั่น cout คือการจับกุ.
mv_p

@mv_p อะไร กัน ส่งผลคุณเห็น?
chux - Reinstate Monica

ด้วยของธรรมดาแบบ'โฟล x=23.976;cout<<x;'ฉันเห็น"23.976"
mv_p

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่