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

Sim*_*lli 2 c++ math precision gcc visual-c++

整整一天我一直在和我认为是一个bug的东西打架但是然后(有一些讨厌的printf调试)它出来了,这是一个奇怪的exp数学函数行为...也许这里有一些我在这里缺少的因为我真的不明白.

能否请您解释一下以下行为:

#include <cmath>

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

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

0.000000
Run Code Online (Sandbox Code Playgroud)

msvc 2012(64位)

3.720075....e-44
Run Code Online (Sandbox Code Playgroud)

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

GCC标志:

g++ -Wall -g -pg *.cpp -o mytest
Run Code Online (Sandbox Code Playgroud)

MSVC带有默认标志.

我在这里错过了什么?exp不是标准精度的标准函数吗?

编辑2

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

编辑

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

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

在Mac上和在Windows 7上运行的相同**源代码的图片

das*_*ght 7

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

printf( "%.50lf\n", exp( -100.0 ) );
Run Code Online (Sandbox Code Playgroud)

会使用gcc生成以下输出:

0.00000000000000000000000000000000000000000003720076
Run Code Online (Sandbox Code Playgroud)

那是3.720076e-44

也使用%le说明符产生 3.720076e-44.

  • 或者,尝试使用"%e"`格式说明符 (2认同)