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

浮动值在版本和调试版本中的行为不同

  •  6
  • KPexEA  · 技术社区  · 17 年前

    你会认为这个“差异”是一个bug还是会有这种差异呢?这是编译器错误还是内部库错误。

    LEFTPOS and SPACING are defined floating point values.
    float def_x;
    int xpos;
    
    def_x = LEFTPOS + (xpos * (SPACING / 2));
    

    问题在于X360编译器。

    9 回复  |  直到 13 年前
        1
  •  11
  •   Nick    17 年前

    释放模式可能设置了不同的FP策略。根据您想要的优化级别,有不同的浮点算术模式。例如,MSVC具有严格、快速和精确的模式。

        2
  •  4
  •   Luke Halliwell    17 年前

    我知道在PC机上,浮点寄存器的宽度是80位。因此,如果计算完全在FPU内完成,您将获得80位精度的好处。另一方面,如果一个中间结果被移出到一个普通寄存器并返回,它将被截断为32位,这将给出不同的结果。

    我不知道这是否也发生在X360上。

        3
  •  3
  •   Branan    17 年前

    这不是虫子。任何浮点运算都有一定的不精确性。在发布模式下,优化将改变操作的顺序,您将得到稍微不同的结果。不过,差别应该很小。如果它很大,你可能会有其他问题。

        4
  •  3
  •   crashmstr    17 年前

    我帮助一位同事找到了一个编译器开关,它在发行版和调试版本中是不同的,而调试版本导致了他的差异。

    看看 /fp (Specify Floating-Point Behavior) .

        5
  •  2
  •   Derek Park    17 年前

        6
  •  1
  •   Jamie    17 年前

    例如,某些平台的浮点寄存器使用的位比存储在内存中的位多,因此将值保留在寄存器中会产生与存储到内存和从内存重新加载略有不同的结果。

        7
  •  0
  •   Dima    17 年前

    这种差异很可能是由编译器优化引起的,编译器优化通常在发布模式下完成,而不是在调试模式下完成。例如,编译器可能会对某些操作重新排序以加快执行速度,这可能会导致浮点结果略有不同。

        8
  •  0
  •   tfinniga    17 年前

    与前面提到的其他寄存器一样,浮点寄存器的精度高于浮点寄存器,因此最终结果的精度取决于寄存器分配。

    如果您需要一致的结果,您可以使变量不稳定,这将导致更慢、更不精确但一致的结果。

        9
  •  0
  •   Die in Sente    17 年前

    如果您设置了一个编译器开关,允许编译器对浮点操作进行重新排序,例如/fp:fast,那么显然这不是一个bug。