У меня проблема с оператором bool тестирования на равенство - PullRequest
1 голос
/ 08 октября 2019

У меня есть программа, предназначенная для тестирования различных экземпляров боковых углов, но я получаю предупреждение, которое, как мне кажется, может испортить мою программу.

По сути, у меня естьдва оператора if

if (sideA == sideB * sin(angA))

и

 else if (sideB > sideA && sideA > sideB * sin(angA))

Где sideA, sideB и angA - все двойные числа, а angA вводится в градусах и переводится в радианы с помощью уравнения angA = angA *3.14159 / 180.

У меня проблема в том, что моя программа читает последнее утверждение, когда оно должно читать первое. В частности, когда я ввожу sideA как 5, sideB как 10 и angA как 30, выражение sideB * sin (angA) читается как 5. Однако по какой-то причине вместо того, чтобы выполнить это как "5 == 5, и, следовательно,первый оператор if должен быть запущен - выполняется содержимое «else if».

Менее вероятная причина этой проблемы, на мой взгляд, заключается в том, что я слишком консервативен с количеством цифр PI, которые я использую, и я должен увеличить его;более вероятная причина - предупреждение, которое я получаю: 1013 *

warning: comparing floating point with == or != is unsafe [-Wfloat-equal]
     else if (sideA == sideB * sin(angA)) {
                                       ^

Я не имею ни малейшего понятия, как с этим бороться, и не могу понять, как подключиться к Интернету.

1 Ответ

1 голос
/ 08 октября 2019

При сравнении значений с плавающей точкой на равенство вы всегда должны проверять, чтобы разница была меньше определенного порога. Поэтому вместо того, чтобы проверять, является ли a == b, нужно проверить abs (ab)

Это связано с внутренней неточностью плавающего значения и тем фактом, чтодаже если он выглядит точным, его двоичное представление может быть неточным

...