Точность относительно двойной переменной в C ++ - PullRequest
0 голосов
/ 20 апреля 2020

Моя проблема в том, что когда я вычисляю одну переменную следующим образом:

UXZ=(DRDe*sY*(Ux2 + Uy2) + cY*DRDt*Tau*(Ux2 + Uy2) + DRDx*Tau*Ux*Sqrt(1 + Ux2 + Uy2) + DRDy*Tau*Uy*Sqrt(1 + Ux2 + Uy2))/(Tau*Sqrt(1 - 1/(1 + Ux2 + Uy2)));

Это значение 1 / (1 + Ux2 + Uy2) устанавливается равным (строго) 1. Тогда мы имеем ошибку, потому что знаменатель равен 0.

Однако члены Ux2 и Uy2 равны (каждому) 1E-32. Следовательно, значение не строго равно 1.

Я не знаю, как установить точность расчета. Каждая переменная в этом уравнении двойная, может быть, я должен поместить их в long?

Редактировать: Этот расчет реализован в генераторе событий, и Ux2 и Uy2 будут меняться / увеличиваться в течение разных времен / итераций. Мы начнем с очень малого значения Ux2 и Uy2, очень близкого к 0, но не строго 0. Если мы сохраняем (1 + 1E-32 + 1E-32) = 1. это полностью нарушает мой код.

Важный код для моего вопроса таков:

UXZ=XX/(YY*Sqrt(1 - 1/(1 + Ux2 + Uy2)));

Я не могу изменить значение Ux2 и Uy2, потому что это изменит рассматриваемую физическую проблему.

1 Ответ

1 голос
/ 20 апреля 2020

Ваш «проблемный» термин:

SQRT( 1 - 1 / ( 1 + Ux2 + Uy2 ) )

Поскольку SQRT(a) идентичен SQRT(b*b * a) / b (т.е. умножить внутри квадрат- root на b - возведя в квадрат и разделив результат на b), затем - используя (1 + Ux2 + Uy2) для b - вы получите:

SQRT( (1 + Ux2 + Uy2)*(1 + Ux2 + Uy2) - (1 + Ux2 + Uy2) ) / (1 + Ux2 + Uy2)

, который должен быть равен одному и тому же значению, не вызывая деление на ноль.

Вероятно, было бы также полезно вывести некоторые общие выражения (например, 1 + Ux2 + Uy2) в переменные.


Чтобы понять почему вас нужно сделать это, вам нужно искать в области Числовой анализ (Википедия), в частности, Генерация и распространение ошибок , которые решают проблему представления произвольных действительных чисел с схемами с ограниченной точностью, используемыми в большинстве компьютерных языков.

Я далеко не эксперт в этом, но по сути, вы должны признать, что хотя 1 - 1 / ( 1 + x ) всегда будет "действительным", предполагая, x является, по крайней мере, немного положительным, в большинстве компьютерных систем Примечания, 1 + x будет вырождаться ровно 1 для достаточно малого x. Часть Числовой анализ распознает это и реорганизует как вы выполняете вычисления, чтобы лучше использовать ограниченную точность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...