整整一天我一直在与我认为是一个错误的东西作斗争,然后(有一些讨厌的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上运行的相同源代码的图片)
答案 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中的格式说明符吗?