Я пытаюсь проверить значения матрицы во вложенном цикле для модульных тестов.Тесты проходят на macOS (clang), но дают сбой Ubuntu 18.04 (gcc версия 7.3.0).
Вот что я пытаюсь сделать (я пытаюсь проверить результат (m3
) - это личностьmatrix):
mat3 m1 = GLM_MAT3_IDENTITY_INIT;
mat3 m2 = GLM_MAT3_IDENTITY_INIT;
mat3 m3;
int i, j, k;
/* test identity matrix multiplication */
glm_mat3_mul(m1, m2, m3);
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
if (i == j) {
assert_true(glm_eq(m3[i][j], 1.0f));
} else {
assert_true(glm_eq(m3[i][j], 0.0f));
}
}
}
Это не работает в Ubuntu / gcc, но проходит в macOS.Если я использую volatile в переменной i , то она также передается в Ubuntu:
mat3 m1 = GLM_MAT3_IDENTITY_INIT;
mat3 m2 = GLM_MAT3_IDENTITY_INIT;
mat3 m3;
volatile i;
int j, k;
/* test identity matrix multiplication */
glm_mat3_mul(m1, m2, m3);
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
if (i == j) {
assert_true(glm_eq(m3[i][j], 1.0f));
} else {
assert_true(glm_eq(m3[i][j], 0.0f));
}
}
}
, если я печатаю значения i и j перед оператором if (i == j) {
без volatile, тоэто также проходит.Возможно i кэшируется и новое значение i не загружается на следующей итерации.Но это также будет верно для mat4 тестов, тот же тест работает для mat4
Использование одного условия (истинное условие или ложное условие) приводит к прохождению теста, но с использованиемв противном случае тест завершается неудачно.
Я использую cmocka для тестирования и запускаю команду make check
для запуска тестов.
mat3 и mat4 определения:
typedef float vec2[2];
typedef CGLM_ALIGN_IF(8) float vec3[3];
typedef int ivec3[3];
typedef CGLM_ALIGN_IF(16) float vec4[4];
#ifdef __AVX__
typedef CGLM_ALIGN_IF(32) vec3 mat3[3];
typedef CGLM_ALIGN_IF(32) vec4 mat4[4];
#else
typedef vec3 mat3[3];
typedef CGLM_ALIGN_IF(16) vec4 mat4[4];
#endif
Должен ли я использовать volatile здесь?Или что не так с моими тестовыми кодами?
PS: Тот же тест проходит для mat4 в Ubuntu, он не работает только для mat3
РЕДАКТИРОВАТЬ:
Значения с плавающей точкой сравниваются с использованием glm_eq(a, b)
:
CGLM_INLINE
bool
glm_eq(float a, float b) {
return fabsf(a - b) <= FLT_EPSILON;
}