Что вы могли бы сделать, это повернуть вокруг середины:
inputMiddle = 0.5*inputMax + 0.5*inputMin
, а затем через средний диапазон ввода:
inputMidRange = 0.5*inputsMax - 0.5*inputMin
вычислить, как далеко от середины находится вход (между-1 и 1):
howFar = (input-inputMiddle) / inputMidRange
затем через выходной средний и выходной средний диапазон, гомотетически сообщите об этом на выход
output = howFar * outputMidRange + outputMiddle
Как отметил Эрик, это может зависеть отпроблемы переполнения, если некоторые из интервалов уже субнормальны, но даже вдвое меньше наименьшего субнормального, это все равно должно работать.
РЕДАКТИРОВАТЬ
Приведенная выше формулировкаответьте о переполнении, но все еще есть проблема катастрофического отмены в операции (input-inputMiddle)
.
Например, для отображения [0,double.MaxValue]
, на [0,double.MaxValue/2]
все «малые» значения будут спроецированы на outputMin
,хотя простая операция input/2
привела бы к правильному выводу ...