У меня есть следующий фрагмент кода:
#include <cstdio>
#include <cstdint>
static const size_t ARR_SIZE = 129;
int main()
{
uint32_t value = 2570980487;
uint32_t arr[ARR_SIZE];
for (int x = 0; x < ARR_SIZE; ++x)
arr[x] = value;
float arr_dst[ARR_SIZE];
for (int x = 0; x < ARR_SIZE; ++x)
{
arr_dst[x] = static_cast<float>(arr[x]);
}
printf("%s\n", arr_dst[ARR_SIZE - 1] == arr_dst[ARR_SIZE - 2] ? "OK" : "WTF??!!");
printf("magic = %0.10f\n", arr_dst[ARR_SIZE - 2]);
printf("magic = %0.10f\n", arr_dst[ARR_SIZE - 1]);
return 0;
}
Если я скомпилирую его в MS Visual Studio 2015, я вижу, что вывод:
WTF??!!
magic = 2570980352.0000000000
magic = 2570980608.0000000000
Итак, последний элемент arr_dst
отличается от предыдущего, но эти два значения были получены путем преобразования того же значения, которое заполняет массив arr!
Это ошибка?
Я заметил, что если я модифицирую цикл преобразования следующим образом, я получаю результат "ОК":
for (int x = 0; x < ARR_SIZE; ++x)
{
if (x == 0)
x = 0;
arr_dst[x] = static_cast<float>(arr[x]);
}
Итак, это, вероятно, проблема с оптимизацией векторизации.
Это поведение не воспроизводится на gcc 4.8. Любые идеи?