Linux-gcc编译的C代码输出和MS-VS2008编译输出之间输出1位差异的原因是什么?

时间:2010-02-09 19:46:55

标签: linux gcc ffmpeg ogg-theora

我在Windows上使用VS-2008编译了Theora视频deocder库和应用程序(Intel x86架构)。我使用此设置来解码theora比特流(*。ogg文件)。该解码器库的源代码用于FFMPEG v0.5源代码包,并进行了一些修改,使其在windows-VS-2008组合上进行编译。

现在当我使用我使用gcc构建的linux(Intel x86架构)上的ffmpeg(V0.5)应用程序解码相同的theora比特流,并获得一些解码输出yuv文件时,此输出文件与从Windows-VS2008设置获得的输出,以及输出文件的几个字节,不是全部。我希望2个输出是位匹配的。

我怀疑以下因素:

a。)两个编译器gcc和MS-VS2008之间的某些数据类型不匹配?

b。)我已经验证代码没有使用任何运行时数学库函数,如log,pow,exp,cos等...但我的代码仍然有一些操作,如(a + b + c)/这可能是个问题吗?

在这两种设置中,这种“除以三”或任何其他数字的实现可能会有所不同。

c。)某种舍入/截断效应的发生方式不同?

d。)我是否可以错过任何在Linux中作为makefile / configure选项存在的宏,这在Windows安装程序中是不存在的?

但我无法缩小问题并解决问题。

1。)我的疑问是否有效,或者是否有任何其他问题可能导致这两种不同设置产生的输出中的这些1位差异。

2.。)我如何调试和解决此问题?

我想,linux-gcc设置和Windows MS编译器之间输出差异的情况甚至可以适用于任何通用代码(不一定特定于我的视频解码器应用程序)

任何指针都会对此有所帮助。

感谢,

-AD

3 个答案:

答案 0 :(得分:1)

我认为,这种行为可能来自x87 / sse2数学。你用的是什么版本的gcc?你使用float(32位)还是double(64位)? x87上的Math在内部具有更多精度位(82),而不是存储在内存中

尝试gcc -ffloat-store的标志; -msse2 -mfpmath = sse

msvc /fp:fast /arch:SSE2

的标志

答案 1 :(得分:0)

1,可能是某个浮点lib的不同优化

2,这是一个问题吗?

编辑:
看一下VS(http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx)上的“/ fprecise”选项或gcc上的“-fprecise-math”。

答案 2 :(得分:0)

关于b),整数和浮点除法在C99中完全指定。 C99指定整数的舍入为零(早期标准为舍入方向实现定义)和IEEE 754为浮点。

听说VS2008没有声称实施C99,这并没有真正帮助。实现定义至少意味着您可以编写一些测试用例并确保在编译器中做出了哪些决定。

如果您真的关心这一点,那么如何检测代码以将详细描述输出到单独的文件并检查第一个差异的跟踪?嘿,也许跟踪已经在那里进行调试了!

相关问题