MSVC和G ++之间奇怪的数学差异

时间:2014-05-16 19:27:47

标签: c++ visual-c++ math gcc precision

整整一天我一直在与我认为是一个错误的东西作斗争,然后(有一些讨厌的printf调试)它发现它是一个奇怪的 exp 数学函数行为..也许我在这里缺少一些东西,因为我真的不明白。

请您解释一下以下行为:

#include <cmath>

printf( "%lf\n", exp( -100.0 ) ); // <--- I know this should be %e, see the edit above

gcc 4.2.1 (在mingw和Mac OS X上都是64位):

0.000000

msvc 2012 (64位)

3.720075....e-44

(其中'....'是小数,我不记得了,因为我在Mac上的家里,所以现在无法测试。)

GCC标志:

g++ -Wall -g -pg *.cpp -o mytest

MSVC,带有默认标志。

我在这里缺少什么? exp 不是标准精度的标准函数吗?

编辑2

好的,这似乎与MSVC默认浮点模型(/ fp:exact)有关...有任何机会与GCC拥有相同的模型吗?我想将该项目作为开源发布,但由于缺乏精确的浮点模型而无法使用最流行的开源编译器,因此没有意义。

修改

好的,所以我使用了错误的printf调用格式(我应该使用%e或%。50lf来打印科学记数法或足够的小数),重点是整个如果使用GCC编译,项目不会给我预期的结果(我正在开发一个带有SMO算法和高斯内核的SVM),而如果我用MSVC编译它(当然没有任何变化),它可以完美地工作。 什么可能导致这种情况?

(在Mac上和使用Windows 7的VM上运行的相同源代码的图片)

Picture of the **same** source code running on a Mac and on a VM with Windows 7

2 个答案:

答案 0 :(得分:7)

计算是相同的,你没有打印足够的数字:

printf( "%.50lf\n", exp( -100.0 ) );

produces the following output with gcc

0.00000000000000000000000000000000000000000003720076

那是3.720076e-44

也使用%le说明符produces 3.720076e-44

答案 1 :(得分:0)

我刚编译并执行

printf("%lf\n", exp(-100.0));

在我的戴尔笔记本电脑(Windows 7,64位和Visual Studio 2012)和我的Macbook Pro(Mountain Lion,64位和XCode)中。两者都在显示

0.000000

结果。

您确定,您没有更改Visual Studio中的格式说明符吗?