代码之家  ›  专栏  ›  技术社区  ›  allo

将一个小范围除以另一个小范围时出现浮点错误

  •  0
  • allo  · 技术社区  · 7 年前

    double min, max, min2, max2, mid, result;
    // min2 < max2 is a subrange of min < max with min2 >= min and max2 <= max
    // where max-min may be very small, which means max2-min2 will be very small as well.
    mid = (min2+max2)/2.0;
    result = (mid - min)/(max-min)
    

    我有一个问题,我得到的值大于1 min, max min2, max2 是双打。 double 变量,但我仍然不确定浮点错误是否会产生错误的结果。

    稍后,我想使用结果通过使用

    const int MAX=63;
    double array[64];
    int index = (int)(result*MAX);
    array[index];
    

    NUM_BINS = 64
    min = -5.00958252
    max = -5.00958014
    min2 = -5.0095801960014716
    max2 = -5.0095799398356107
    mid = (max2+min2) / 2.0
    mid - min = 2.4516127083984429e-06
    (mid - min) / (max - min)) * (NUM_BINS - 1) = 64.781696632504463
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   aka.nice    7 年前

    假设IEEE754算法,如果最小值和最大值足够接近,则差值是精确的。

    min2 <= mid
    mid <= max2
    

    mid-min 将是精确的(因此 <= (max-min)

    如果编译器决定使用超精度,上述关系仍然成立。当你使用混合精度时会发生什么,我不太明白……我很好奇你是否能展示出精确的值(十六进制格式)。