Как можно масштабировать значение Int64 без доступа к более крупному типу?C#

Место общения программистов C#
Ответить
Anonymous
 Как можно масштабировать значение Int64 без доступа к более крупному типу?

Сообщение Anonymous »

Я провел рефакторинг кода этого класса, чтобы он был более удобен для моих вариантов использования; одна проблема, которую я заметил во время тестирования, заключается в том, что я не могу преобразовать это конкретное уравнение для использования длинных входных данных, поскольку присвоение переменным a и m переполняется на этапах умножения/вычитания. При использовании входных данных типа int все просто великолепно, потому что их можно привести к типу long, чтобы предотвратить переполнение. Можно ли что-нибудь сделать, чтобы обеспечить правильное поведение при длинных входных данных?*

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

public static Func Scale(int inputX, int inputY, int outputX, int outputY) {
if (inputX > inputY) {
var z = inputX;

inputX = inputY;
inputY = z;
}

if (outputX > outputY) {
var z = outputX;

outputX = outputY;
outputY = z;
}

var a = (((((double)inputScaleX) * (outputScaleX - outputScaleY)) / ((long)inputScaleY - inputScaleX)) + outputScaleX);
var m = (((double)(outputScaleY - outputScaleX)) / ((long)inputScaleY - inputScaleX));

return (value) => ((int)((value * m) + a));
}
Например, если я заменил каждый экземпляр int в приведенной выше функции на long, то result будет иметь неправильное значение в следующем коде:

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

Func scaler = Scale(long.MinValue, long.MaxValue, -5, 5);

var result = scaler(long.MaxValue - 3);
Ожидаемый результат — 4, но фактический результат -9223372036854775808 не только неверен, но и выходит за пределы определенного диапазона [-5, 5].

*За исключением прямого использования BigInt или реализации 64-битного умножения и деления в программном обеспечении; Я уже реализую эти операции в качестве обходного пути и ищу альтернативные решения, с которыми еще не сталкивался.

Подробнее здесь: https://stackoverflow.com/questions/589 ... arger-type
Ответить

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

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

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

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

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