非常大数字的表示乘以pow()

时间:2014-12-23 11:34:22

标签: c++ math floating-point

在我的计算中,我有几个输入变量

  

M_s = 1.989×〖10〗^ 30
      G = 6.67384×〖10〗^( - 11)
      a = 1.496×〖10〗^ 8

当我写

之类的东西时
long double G = 6.67384 * (pow(10,-11));  

我收到错误消息:

c:\users\user\documents\visual studio 2010\projects\1.det.earth location in orbit\1.det.earth location in orbit\1.det.earth location in orbit.cpp(15): error C2668: 'pow' : ambiguous call to overloaded function
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(583): could be 'long double pow(long double,int)'
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(535): or       'float pow(float,int)'
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(497): or       'double pow(double,int)'
1>          while trying to match the argument list '(int, int)'

我怎样才能表达“G等于6.67384乘以10到-11的幂”并得到正确答案?我应该包括哪些STL库?

3 个答案:

答案 0 :(得分:4)

只需更改此行

即可
long double G = 6.67384 * (pow(10,-11));  

到这个

long double G = 6.67384 * pow(10.0, -11);  

问题是,您正在为int的两个参数传递pow,编译器需要三个参数中的一个

long double pow(long double, int);
float pow(float, int);
double pow(double, int);

因此对要调用的函数感到困惑。

但是因为在C ++中你可以像这样直接表达10的幂

long double G = 6.67384E-11;

你真的不需要pow功能。

答案 1 :(得分:3)

Benjamin Bannier在评论中有更好的主意。但那里有一个不允许的空间;清理它看起来像这样:

long double G = 6.67384e-11; 

这可能更准确,也可能更快,因为转换为二进制文件是由编译器完成的。当然,一个科学家的价值是熟悉的,我意识到真正的准确性问题是由我们对G的有限测量引起的。你真的不需要long double,今天float就足够了在可预见的未来,double就足够了(我们很快就不会知道G到15位数)

答案 2 :(得分:1)

您需要阅读并理解错误消息:

'pow' : ambiguous call to overloaded function
could be 'long double pow(long double,int)'
or       'float pow(float,int)'
or       'double pow(double,int)'
          while trying to match the argument list '(int, int)'

消息说编译器无法猜测你想要的函数的重载,因为第一个参数是int,它可以用三种不同的方式进行转换。

如果您需要long double结果,请传递long double常量或投射它:

10.l
(long double)10