【发布时间】:2014-02-06 15:22:21
【问题描述】:
我有 C++ 程序。如果我运行相同部分的代码,Linux 和 Windows 会给出不同的结果。
#include <cmath>
#include <cfloat>
#include <cstdio>
#define MPI 3.141592653589793238462
#define DEG_TO_RAD(x) ((x) * 0.0174532925)
#define cot(x) (1.0 / tan(x))
#define sec(x) (1.0 / cos(x))
double p1 = DEG_TO_RAD(35);
double p2 = DEG_TO_RAD(65);
double lambertN = log(cos(p1) * sec(p2));
lambertN /= (log(tan(0.25 * MPI + 0.5 * p2) * cot(0.25 * MPI + 0.5 * p1)));
double t = tan(0.25 * MPI + 0.5 * p1);
double lambertF = cos(p1) * pow(t, lambertN);
//---------------------------
//specify input coordinates in degrees
double lon = 160.25;
double lat = 245.75;
double longitude = DEG_TO_RAD(lon - 10);
double latitude = DEG_TO_RAD(lat);
double c = cot(0.25 * MPI + 0.5 * latitude);
double lambertPhi = lambertF * pow(c, lambertN);
printf("%f", lambertPhi); // here I got different results on Win and Linux
在 Windows 上,我得到了正确的结果(或者看起来如此,因为最终结果还可以)。
在 Linux 上,我得到了NaN 或一些非常小的数字,与 Windows 相当。
我错过了什么?
编辑#1:
Windows - Visual Studio 2010 - 通过 GUI 构建
Linux - gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) - 使用 makefile 构建,标志:CFLAGS = -lm -lstdc++ -Wall -O2
两个系统都是 64 位的
PS: 如果有人感兴趣,这是 Lambert-Conic 投影方程的一部分。
【问题讨论】:
-
你应该告诉你正在使用什么编译器。还有,这个sn -p 还不够编译试试。您可以自己做的是逐步完成程序的这一部分并比较两个平台上的值,以找出两个版本开始分歧的地方。
-
我认为我们需要一个合适的 SSCCE,以及两个环境的精确细节。编译器版本,32/64 位等
-
@MartinPerry lon 和 lat 的类型和值是什么,请添加
标头以获得可编译代码。 -
我刚刚分别为
lon和lat选择了值120和45,并得到了一个有效的0.686144作为输出。对我来说没有NaN。请提供您遇到问题的lon和lat值。 -
为什么我们不能有 SSCCE?你不想回答吗?您不想确保我们编译的代码与您完全相同吗?