Memory comparison of float-point values

Объектное представление значений с плавающей точкой может отличаться (то же самое) для равного (не равный) значения с плавающей точкой

Описание

Этот дефект происходит, когда вы сравниваете объектное представление значений с плавающей точкой или объектное представление структур, содержащих члены с плавающей точкой. Когда вы используете функции memcmp, bcmp, или wmemcmp чтобы выполнить сравнение комбинации двоичных разрядов, дефект повышен.

Риск

Объектное представление значений с плавающей точкой использует определенные комбинации двоичных разрядов, чтобы закодировать те значения. Значения с плавающей точкой, которые равны, например, -0.0 и 0.0 в стандарте IEC 60559, может иметь различные комбинации двоичных разрядов в их объектном представлении. Точно так же значения с плавающей точкой, которые не равны, могут иметь ту же комбинацию двоичных разрядов в своем объектном представлении.

Фиксация

Когда вы сравниваете структуры, содержащие члены с плавающей точкой, сравниваете элементы структуры индивидуально.

Чтобы сравнить два значения с плавающей точкой, используйте == или != операторы. Если вы следуете стандарту, который препятствует использованию этих операторов, таких как MISRA®, гарантируйте, что различие между значениями с плавающей точкой в допустимом диапазоне.

Примеры

развернуть все

#include <string.h> 

typedef struct {
    int i;
    float f;
} myStruct;

extern void initialize_Struct(myStruct *);

int func_cmp(myStruct *s1, myStruct *s2) {
/* Comparison between structures containing 
* floating-point members */
    return memcmp 
        ((const void *)s1, (const void *)s2, sizeof(myStruct));
}

void func(void) {
    myStruct s1, s2;
    initialize_Struct(&s1);
    initialize_Struct(&s2);
    (void)func_cmp(&s1, &s2);
}

В этом примере, func_cmp() вызовы memcmp() сравнить объектные представления структур s1 и s2. Сравнение может быть неточным, потому что структуры содержат члены с плавающей точкой.

Коррекция — сравнивает элементы структуры индивидуально

Одна возможная коррекция должна сравнить элементы структуры индивидуально и гарантировать, что различие между значениями с плавающей точкой в допустимом диапазоне, заданном ESP.

#include <string.h> 
#include <math.h>

typedef struct {
    int i;
    float f;
} myStruct;

extern void initialize_Struct(myStruct *);

#define ESP 0.00001

int func_cmp(myStruct *s1, myStruct *s2) {

/*Structure members are compared individually */	
    return ((s1->i == s2->i) &&
            (fabsf(s1->f - s2->f) <= ESP)); 
}

void func(void) {
    myStruct s1, s2;
    initialize_Struct(&s1);
    initialize_Struct(&s2);
    (void)func_cmp(&s1, &s2);
}

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: MEMCMP_FLOAT
Удар: низко
Введенный в R2018a