Передача float функции в C++, по-видимому, изменяет точность

0

Вопрос

Это очень простой вопрос, но мне любопытно узнать причину этого: -Если я отладю следующий код на C++ :

void floatreturn(float i){
      //nothing
}

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

Отслеживая переданное значение a, при вводе floatreturn оно выглядит как 23,9759998. В результате любая обработка значения в функции потребует ручной настройки точности. Есть ли для этого причина и есть ли способ избежать этого?

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

Лучший ответ

0

Проблема возникла раньше floatreturn(a);.
Это произошло в float a = 23.976;
floatreturn(a); это не имеет значения.

Существует около 2^32 различных значений, которые float может точно кодировать. 23.976 не является одним из них. Ближайшая кодируемая float это примерно 23,9759998...

Чтобы избежать этого, используйте значения, которые могут точно кодироваться как float или терпеть близость - примерно 1 часть из 2 24

2021-11-24 16:43:03

Спасибо Марку за ссылку и чуксу за краткий ответ.
mv_p

Еще один поучительный момент для меня: почему cout по умолчанию имеет точность 3 десятичных знака, если мы перепечатываем переменную без установки точности для вывода? Я понимаю, что сохранение поплавка всегда будет возвращать максимально возможный двоичный поплавок, и что cout округляется.
mv_p

@mv_p Какой именно результат вы видели?
chux - Reinstate Monica

с помощью простого "float x = 23,976; cout << x;" я вижу "23,976"
mv_p

На других языках

Эта страница на других языках

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