﻿# V3024\. An odd precise comparison\. Consider using a comparison with defined precision: Math\.Abs\(A \- B\) < Epsilon or Math\.Abs\(A \- B\) \> Epsilon\.

Анализатор обнаружил подозрительный фрагмент кода, где для сравнения чисел с плавающей точкой используется оператор '\=\=' или '\!\='\. Такие участки кода могут служить источником ошибок\.

Рассмотрим для начала корректный пример кода \(на который тем не менее будет выдано предупреждение\): 

```cpp
double a = 0.5;
if (a == 0.5) //ok
  ++x;
```

В данном случае сравнение можно считать верным\. Перед сравнением переменная 'a' явно инициализируется значением '0\.5'\. С этим же значением производится сравнение\. Результатом выражения будет 'истина'\.

Итак, в некоторых случаях точные сравнения допустимы\. Но часто так сравнивать нельзя\. Рассмотрим пример ошибочного кода:

```cpp
double b = Math.Sin(Math.PI / 6.0); 
if (b == 0.5) //err
  ++x;
```

Условие  'b \=\= 0\.5' при проверке оказалось ложным из\-за того, что значение выражения 'Math\.Sin\(Math\.PI / 6\.0\)' равно 0\.49999999999999994\. Это число очень близко к '0\.5', но ему не равно\.

Одним из вариантов решения является сравнение разности значений с каким\-то значением \(погрешностью, в данном случае \- переменная 'epsilon'\):

```cpp
double b = Math.Sin(Math.PI / 6.0); 
if (Math.Abs(b - 0.5) < epsilon) //ok
  ++x;
```

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

Анализатор указывает на участки кода, где в сравнении чисел с плавающей точкой используются операторы '\!\=' или '\=\='\. Является это сравнение ошибочным или нет, может решить только программист\.

**Дополнительные ресурсы:**

1. [Stack Overflow \- Comparing double values in C\#](https://stackoverflow.com/questions/1398753/comparing-double-values-in-c-sharp)