﻿# V1014\. Structures with members of real type are compared byte\-wise\.

Анализатор обнаружил подозрительный способ сравнения двух структур, которые содержат в себе члены типа float или double\.

Пример:

```cpp
struct Object
{
  int Length;
  int Width;
  int Height;
  float Volume;
};
bool operator == (const Object &p1, const Object &p2)
{
  return memcmp(&p1, &p2, sizeof(Object)) == 0;
}
```

Так как структура 'Object' содержит числа с плавающей точкой, то их сравнение через 'memcmp' может привести к неожиданному результату\. Например, числа \-0\.0 и 0\.0 эквивалентны, но имеют разное битовое представление\. Два [NaN](https://ru.wikipedia.org/wiki/NaN) имеют одинаковое представление, но они не эквивалентны\. Возможно стоит использовать оператор \=\= или сравнивать эти переменные с определённой точностью\.

Допустим, мы хотим сравнивать члены классы с помощью оператора \=\=\. В этом случае можно вообще удалить 'operator \=\=', так как компилятор сделает сам всё правильно, реализуя оператор сравнения по умолчанию\. Однако, допустим мы хотим написать именно свою функцию, где будем сравнивать члены 'Volume' с определённой точностью\. Тогда, исправленный вариант может выглядеть так:

```cpp
bool operator == (const Object &p1, const Object &p2)
{
  return    p1.Length == p2.Length
         && p1.Width  == p2.Width
         && p1.Height == p2.Height
         && fabs(p1.Volume - p2.Volume) <= FLT_EPSILON;
}
```