-4

Я пытаюсь заполнить динамически распределенные массивы числами, которые вычисляются в программе. Один из этих массивов очень большой (1000 x 900 x 3).C++ - двойная точность приводит к недетерминированному выводу, float не

Если я заполняю его удвоениями, выход программы иногда будет разумным, но при последовательных запусках одного и того же кода будут созданы разные выходы. В большинстве случаев они становятся абсурдно огромными (10e + 74 или 10e + 228). Однако, если я использую поплавки для этого конкретного массива, все в порядке - числа разумны и воспроизводимы.

Любые мысли, почему это происходит? Еще более важно: Могу ли я просто держать плавающей или может ли быть большая проблема, которая нуждается в дальнейшем исследовании

Edit:

Вычисленное записи из большого массива:

T[it+1][ix][iy] = T[it][ix][iy] + ((1/(dx*dx))*(T[it][ix+1][iy] - 2*T[it][ix][iy] + T[it][ix-1][iy]) + (1/(dy*dy))*(T[it][ix][iy+1] - 2*T[it][ix][iy] + T[it][ix][iy-1]) + M_SQRT2*cos(iy*dy)- Pe*((1/((2*dx)))*vx[it][ix][iy]*(T[it][ix+1][iy]-T[it][ix-1][iy]) + (1/(2*dy))*vy[it][ix][iy]*(T[it][ix][iy+1] - T[it][ix][iy-1])))*dt; 

Я не хочу публиковать весь код, он очень большой. Если вы хотите увидеть что-нибудь еще, сообщите мне.

Edit 2:

После перезаписи программы с 3D-векторов, которые ничего не меняют. В конце концов я узнал, что я использовал четное число для размеров массива. Изменение его (и интервалов dx и dy) на нечетное число исправляет проблему. Любые мысли об этом явлении?

+5

Показать код – Spo1ler

+5

Похоже, что у вас есть ошибка в коде. –

+3

Не видя кода, который управляет данными, немного сложно предложить что-то полезное. –

ответ

1

Чтобы ответить на ваш вопрос: вы, как правило, не должны видеть неправильное поведение с удвоением, если у вас есть правильное поведение с поплавками (наоборот, вполне возможно, так как поплавки более подвержены ошибкам округления и переполнению/переполнению).

Обычно, если вы видите экстремальные значения, такие как 10e+228, это знак того, что вы получаете доступ к неинициализированной памяти: убедитесь, что все ваши переменные и значения массива были правильно инициализированы.

+0

Спасибо, это тоже была моя первоначальная мысль, но я посмотрел на нее довольно интенсивно и не нашел ничего плохого, но я еще раз посмотрю ... – chris1992

+0

10e + 228 is hex 6f7a6208b5068394. 10e + 74 - 4f81afd6ec0e1411. Оба выглядят так, как будто они могут быть слегка искаженными данными ASCII, что согласуется с неинициализированной теорией данных. –

Смежные вопросы