Обертывание действительных чиселC#

Место общения программистов C#
Ответить
Anonymous
 Обертывание действительных чисел

Сообщение Anonymous »

Периодическая граница — это место, где частицы, выходящие за пределы поля моделирования, повторно входят с противоположной стороны, имитируя бесконечную систему.
Если L = периодическая длина, то
  • Только в случае положительных осей значения переносимых координат должны находиться в диапазоне [0, L) (исключительно справа, т. е. значения оборачиваются до L).
  • В случае смешанных отрицательно-положительных осей значения переносимых координат должны находиться в диапазоне [-L/2, L/2] (оба включительно).

Примеры для положительных координат, где L=10 и обернутые значения должны оставаться между [0, 10) (левая сторона включительно и правая сторона). эксклюзивный):

Пример переноса только положительных значений (L=10):
  • WrapPositive(10 , 3.0) → 3.0
  • WrapPositive(10, 12.0) → 2.0
  • WrapPositive(10, -1.0) → 9.0
  • WrapPositive(10, 0.0) → 0.0
  • WrapPositive(10, 10.0) → 0.0
  • WrapPositive(10, 0.001) → 0.001

Код: Выделить всё

double WrapPositive(double periodicDistance, double position)
{
return (position % periodicDistance + periodicDistance) % periodicDistance ;
}
эта процедура отлично работает для всех заданных условий.
Примеры для смешанных отрицательно-положительных координат, где L=10 и обернутых значений должно оставаться в диапазоне [-5, 5] (обе стороны включительно):
  • WrapNegativePositive(10, 3.0) → 3.0
  • WrapNegativePositive(10, 6.0) → -4.0
  • WrapNegativePositive(10, -6.0) → 4.0
  • WrapNegativePositive(10, 0.0) ) → 0.0
  • WrapNegativePositive(10, -5.0) → -5.0
  • WrapNegativePositive(10, 5.0) → 5.0
  • WrapNegativePositive(10, 4.999999999) → 4.999999999
  • WrapNegativePositive(10, -5.000000001) → -4.999999999

Код: Выделить всё

double WrapNegativePositive(double periodicDistance, double position)
{
return ((position + periodicDistance / 2) % periodicDistance + periodicDistance) % periodicDistance - periodicDistance / 2;
}
Эта процедура завершается успешно, за исключением #6, которая дает (-5.0, -5.0, -5.0) после переноса.
Как я могу внести исправления в вторая процедура?
Примечание. Я не должен использовать if-else или ?: (условный оператор) только из соображений производительности. Когда я работаю с тысячами частиц, проверка каждой координаты для каждой оси значительно снижает производительность.

Подробнее здесь: https://stackoverflow.com/questions/793 ... al-numbers
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»