C++ 如何避免;陷阱“;用线性插值?

C++ 如何避免;陷阱“;用线性插值?,c++,linear-interpolation,C++,Linear Interpolation,我有一个范围a(起始范围)和一个范围b(目标范围),我需要将一个值aX从范围a缩放到范围b。代码是一种基本的线性插值: double LinearInterpolation(double a0, double a1, double b0, double b1, double aX) { return b0 + (b1 - b0) * (aX - a0) / (a1 - a0); } 事实是:范围b可以是0长度,从1.0到1.0。但当我达到这个范围时,我得到了一个值,它是“陷阱”,不能返

我有一个范围
a
(起始范围)和一个范围
b
(目标范围),我需要将一个值
aX
从范围
a
缩放到范围
b
。代码是一种基本的线性插值:

double LinearInterpolation(double a0, double a1, double b0, double b1, double aX) {
    return b0 + (b1 - b0) * (aX - a0) / (a1 - a0);
}
事实是:范围b可以是0长度,从1.0到1.0。但当我达到这个范围时,我得到了一个值,它是“陷阱”,不能返回。例如:

int main ()
{
    double a0 = 0.4;
    double a1 = 1.0;
    double b0 = 0.6;
    double b1 = 1.0;

    double aX = 0.58;

    aX = LinearInterpolation(a0, a1, b0, b1, aX);
    std::cout << aX << std::endl;

    b0 = 1.0;
    aX = LinearInterpolation(a0, a1, b0, b1, aX);
    std::cout << aX << std::endl;

    b0 = 0.6;
    aX = LinearInterpolation(a0, a1, b0, b1, aX);
    std::cout << aX << std::endl;    
}
int main()
{
双a0=0.4;
双a1=1.0;
双b0=0.6;
双b1=1.0;
双轴=0.58;
aX=线性插值(a0、a1、b0、b1、aX);
标准::cout
我怎样才能避免这种情况

不存储实际值,而是存储范围内的相对位置:

struct value_in_range {
  double normalized_offset;
  double in_range (double from, double to) const {
    return from + (to - from) * normalized_offset;
  }
};

value_in_range make_value_in_range (double from, double value, double to) {
  // Add assertions to avoid misuse
  return {(value - from) / (to - from)};
}
以你的例子:

int main ()
{
    double a0 = 0.4;
    double a1 = 1.0;
    double b0 = 0.6;
    double b1 = 1.0;

    double aX = 0.58;

    value_in_range X = make_value_in_range (a0, aX, a1);

    std::cout << X.in_range(b0, b1) << std::endl;

    b0 = 1.0;
    std::cout << X.in_range(b0, b1) << std::endl;

    b0 = 0.6;
    std::cout << X.in_range(b0, b1) << std::endl;
}
int main()
{
双a0=0.4;
双a1=1.0;
双b0=0.6;
双b1=1.0;
双轴=0.58;
_范围内的_值X=_范围内的_值(a0,aX,a1);

std::cout什么是标准化的\u偏移量?成员存储(基本上)值从范围的开始到结束的距离的百分比。0表示它在开始处,1表示在结束处。现在确定如何将“确保\u范围内的\u值\u”返回存储到标准化的\u偏移量:O