一则浮点计算异常的处理随笔
今天上午,接手一段计算视频长宽比例的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开张第一日,写此随笔开张。
浙公网安备 33010602011771号