一则浮点计算异常的处理随笔

     今天上午,接手一段计算视频长宽比例的c++代码,在vc2008编译器下,会报异常,导致程序crash. 查来查去,招数几乎用光,还是不能解决, 如下:

double widthRatio = (double)displayWidth / newWidth;
double heightRatio = (double)displayHeight / newHeight;
double ratio = (widthRatio > heightRatio)?widthRatio:heightRatio;
if (ratio <= 1.0)
{
   displayWidth = newWidth;
   displayHeight = newHeight;
}else{
   displayWidth = (int)(ratio * newWidth);             //此处结果异常
   displayHeight = (int)(ratio * newHeight);            //此处结果异常

}

 首先怀疑的是强制类型转换问题,因为在c++的转换与c的隐形转换不同,有时要写明,所以改成:

      float  fw = static_cast<float>(newWidth);

        float  fh = static_cast<float>(newHeight);

        displayWidth = static_cast<int>(ratio * fw);

        displayHeight = static_cast<int>(ratio *fh);

     但是,结果还是错误!好吧,试下一招:

        在.cpp的头文件中加入 #include <math.h>, 这个c库对浮点计算支持很全面,运行一看,结果正确一半, displayHeight正确,displayWidth错误!

        看来这招也行不通。

 郁闷之下,忽然想起几年前在x264的slice_write这个函数中遇到同样的问题,浮点计算出现莫名其妙的问题,莫不是x86的浮点寄存器状态不对,于是乎,

 加入一句:

      __asm emms

   运行之,结果正确,问题解决。

 

    Blog开张第一日,写此随笔开张。

 

posted on 2016-01-08 15:13  zwshare  阅读(591)  评论(0)    收藏  举报

导航