Я работаю над численным анализом с использованием решателя (программирование основано на объектно-ориентированном C++), скомпилированном с двойной точностью, а мой блок - 64-разрядный. Моя проблема заключается в том, что когда решатель вычисляет большое число - например, -1.45 для мощности 21, чтобы взять фактический пример - и суммирует его в выделенной памяти, передавая это значение существующей переменной, он преобразуется в 0. Таким образом, Конечно, когда я позже использую эту переменную в делении, я получаю ошибку сегментации. Я не понимаю, как работает этот процесс, и потому, что я использую DP, я не вижу, как исправить эту проблему. Может ли кто-нибудь дать мне руку с этим вопросом, пожалуйста?Обработка переменных большого числа цифр в объектно-ориентированном C++
В случае, если это помогает: я просто проверил тест, в котором я указываю a = -1.45e + 21, и «распечатайте» значение, которое корректно возвращается решателем. Но когда я не использую показатель «e» и введите полное значение (с 19 нулями), я получаю 0 взамен. Поэтому я думаю, что проблема/ограничение исходит из числа цифр, любых идей? Благодаря !
Редактировать: Я публикую краткую информацию о шагах, которые я выполняю, для вычисления одной из переменных, представляющих проблему. Другие аналогично определены. Сначала я инициализирует списки указателей поля:
PtrList<volScalarField> fInvFluids(fluidRegions.size());
Где класс volScalarField просто массив в два раза. Затем я заполнить списки указателей поля:
fInvFluids.set
(
i,
new volScalarField
(
IOobject
(
"fInv",
runTime.timeName(),
fluidRegions[i],
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
fluidRegions[i],
dimensionedScalar
(
"fInv",
dimensionSet(3,1,-9,-1,0,0,0),
scalar(0)
)
)
);
После этого я установил полевые области:
volScalarField& fInv = fInvFluids[i];
И, наконец, я вычислить значение:
// Info<< " ** Calculating fInv **\n";
fInv = gT*pow(pow(T/Tlambda, 5.7)*(1 - pow(T/Tlambda, 5.7)), 3);
где T является переменным полем и Tlambda - скалярное значение, определенное во время выполнения.
Пожалуйста, разместите код, в котором вы берете энергию и сохраняете ее в стеке. – UsamaMan
Рассмотрите возможность использования библиотеки [GMP library] (https://gmplib.org/) для больших чисел. –
Я редактирую свой комментарий. Я проверил библиотеки, скомпилированные с программным обеспечением, и GMP-5.1.2 установлен, поэтому я думаю, что проблема возникает в другом месте. – SimoMJ