Перечисляет диапазоны номеров - PullRequest
0 голосов
/ 23 октября 2019

Мне нужно преобразовать число от 0 до 65535 в другое число от -800 до 240

, поэтому, если oldNumber = 0, то newNumber = -800

public static int ConvertA(int oldNumber)
{

}

newNumber = ConvertA(oldNumber);

и наоборот, так что если это от -800 до 240, то конвертируйте его в 0 в 65535

public static int ConvertB(int oldNumber)
{

}
newNumber = ConvertB(oldNumber);

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

У вас есть два целочисленных интервала A = [0, 65535] и B = [-800, 240], и вы хотите отобразить f: A -> B.

Похоже, вы заявили, что хотите также ограничения:

  • f(0) == 240
  • f has a inverse transform g.

Поскольку число элементов в A (65536) больше, чем количество элементов в B (1041),по принципу голубиного отверстия f не может быть injective (должно быть x, y в A, так что f(x) == f(y)).

В результате, f не может иметьобратное преобразование g. Это означает, что ограничения не могут найти решение. То есть ваш вопрос не имеет решения .

Также обратите внимание, что ваше преобразование не может быть linear. Если бы оно было линейным, оно должно было бы удовлетворять f(a*x) == a*f(x) для каждых a и x, и это не может быть правдой, потому что если мы выберем x == 0 и a == 2, у нас будет f(2*0) == f(0) == 240 == 2 * f(0) == 480, что явно абсурдно.

Линейность требует f(0) == 0.


Но тогда давайте проявим гибкость и изменим ваши ограничения ...

Итак, давайте предположим,чем то, что нам не нужно обратное, и что f не должно быть линейным. Возможно отображение, такое как

f(x) := max((-x) + 240, -800) удовлетворяет вашим потребностям.

В этом случае:

  • f(0) == max(240, -800) == 240, первое ограничение выполнено
  • Мы можем определить g: B -> A как g(x) := (-x) + 240, что удовлетворяет g(240) == 0 и таково, что f(g(x)) == max((x - 240) + 240, -800) == max(x, -800) == x, что означает f, является инверсией g, если ограничено Range из g.

В итоге могут подойти следующие решения:

  • f(x) := max((-x) + 240, -800)
  • g(x) := (-x) + 240

Только не ожидайте линейности и / или обратных преобразований.


Используя это предположение, у вас есть это:

public static int ConvertA(int oldNumber)
{
    if(oldNumber < 0 || oldNumber > 65535)
        throw new ArgumentOutOfRangeException();
    return Math.Max((-oldNumber) + 240, -800);
}
int newNumber = ConvertA(oldNumber);
public static int ConvertB(int oldNumber)
{
    if(oldNumber < -800 || oldNumber > 240)
        throw new ArgumentOutOfRangeException();
    return -oldNumber + 240;
}
int newNumber = ConvertB(oldNumber);

Имейте в виду, что, как обсуждалось в начале, что ConvertB(ConvertA(65535)) не является 65535, так как ConvertB не является обратным к ConvertA

0 голосов
/ 23 октября 2019

Я понял это.

private static int Convert(int OldMax, int OldMin, int NewMax, int NewMin, int OldValue)
{
   int NewValue = 0;
   int NewRange = 0;
   int OldRange = 0;

    OldRange = (OldMax - OldMin);
    if (OldRange == 0)
    NewValue = NewMin;
    else
    {
       NewRange = (NewMax - NewMin);
       NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin;
    }

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