Prateek Senapati Ответов: 3

Что я могу сделать, чтобы точно сравнить две переменные типа float в C++, одна из которых инициализируется во время объявления, а другая вычисляется с помощью программы?


Надеюсь, у вас все хорошо.
Когда я сравниваю две переменные со значением 0,5 или 0,25, программа показывает желаемый результат, но когда я сравниваю две переменные со значением 0,333333 или 0,666667, программа не показывает желаемый результат. Скажите, пожалуйста, где я ошибаюсь? Пожалуйста, помогите мне написать правильный фрагмент кода. Я новичок, и это будет большой опыт, чтобы учиться у вас. Спасибо за заботу.Вот код с некоторыми выходами:

#include 


ВЫХОДЫ:

0.333333 0.333333
НЕРАВНЫЙ

0.666667 0.666667
НЕРАВНЫЙ

0.25 0.25
РАВНЫЙ

0.5 0.5
РАВНЫЙ


С уважением,
Пратек Сенапати

Что я уже пробовал:

Я пытался ввести различные десятичные значения, но не получил ожидаемых результатов во всех случаях.

3 Ответов

Рейтинг:
2

Jochen Arndt

Числа с плавающей запятой не могут точно представлять большинство действительных чисел. Числа 0.25 и 0.5 могут быть представлены точно, но не 0.33 и 0.66.

Это происходит из-за того, как эти числа представлены внутри (см. IEEE Floating Point - Википедия[^].

Чтобы проверить, являются ли числа с плавающей запятой почти равными, необходимо выполнить специальные проверки. См., например Руководство С Плавающей Запятой-Сравнение[^].


Рейтинг:
2

Patrice T

Мы не делаем вашу домашнюю работу.
Домашнее задание не предназначено для проверки ваших навыков просить других людей выполнять вашу работу, оно предназначено для того, чтобы помочь вашему учителю проверить ваше понимание пройденных вами курсов, а также проблем, возникающих при их применении.
Любая ваша неудача поможет учителю выявить ваши слабости и наметить меры по их исправлению.
Итак, попробуйте, перечитайте свои уроки и приступайте к работе. Если вы застряли на конкретной проблеме, покажите свой код и объясните эту точную проблему, мы можем помочь.


Prateek Senapati

На самом деле я не мог правильно сформулировать свой вопрос. Мой вопрос включал в себя код и некоторые выходные данные. Я не могу понять, как его отредактировать. Я очень сожалею о причиненных неудобствах.

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.

Prateek Senapati

Вот код:
#включать

Prateek Senapati

Я не могу ввести фрагмент кода после #include

Рейтинг:
1

nv3

Просто учтите, что представление с плавающей запятой не может точно выражать числа, подобные 1/3. Формат чисел с плавающей запятой использует дробное представление в базе 2, то есть он может правильно представлять такие числа, как 1/2, 1/4, 1/8, 1/16 и т. д., Но не 1/3 или 1/5. Для них он использует самое близкое приближение. Теперь, когда вы выполняете вычисления в формате с плавающей запятой, ошибка аппроксимации становится все больше и больше с каждым отдельным вычислением. Следовательно, представление 0.3333... как константы в вашей программе может быть не совсем равно результату ваших вычислений.

Решение: не сравнивайте на равенство, но всегда допускайте небольшую ошибку аппроксимации.


Prateek Senapati

Я не мог понять решение, но оно кажется полезным. Как я могу допустить небольшое приближение и все же получить ожидаемый результат?
Вот мой код:
#включать

nv3

Ваш код не был показан в комментарии. Используйте зеленую кнопку "улучшить вопрос" под вашим вопросом, чтобы добавить свой код.

Сравнение должно выглядеть так:

если (fabs (x-y) < epsilon) {
...
}

А Эпсилон - это допустимый предел аппроксимации, например 1е-8, Если вы вычисляете в двойном порядке и ваши значения находятся в диапазоне 1.