函数的奇怪行为

Strange behaviour for functions

本文关键字:函数      更新时间:2023-10-16

所以基本上我有一个重载函数来计算范数:

double Szabo::norme(Gaussienne gaussienne, Atome atome) {
    return sqrt(pow(gaussienne.GetX()-atome.x,2)+pow(gaussienne.GetY()-atome.y,2)+pow(gaussienne.GetY()-atome.y,2));
}
double Szabo::norme(Gaussienne gaussienneA, Gaussienne gaussienneB)
{
    return sqrt(pow(gaussienneA.GetX()-gaussienneB.GetX(),2.0) + pow(gaussienneA.GetY()-gaussienneB.GetY(),2.0) + pow(gaussienneA.GetZ()-gaussienneB.GetZ(),2.0));
}

Gaussienne & Atome(类和结构)的定义是这样的:

原子:

struct Atome
{
    double x; double y; double z; double numeroAtomique;
};

高斯西安:

#ifndef GaussienneHeader
class Gaussienne
{       
    protected:
        // attributs
        double alpha;
        double coordX,coordY,coordZ;
    public:
        // methodes:
            // Constructeurs:
            Gaussienne();
            Gaussienne(double alpha,double x, double y, double z);
            // Accesseurs:
            double GetAlpha() const; //return this->alpha
            double GetX() const; //return this coordX
            double GetY() const; // return this coordY
            double GetZ() const; // return this coordZ
};
#define GaussienneHeader
#endif

所以现在,我想计算 2 个高斯 A 和 B 的中心与位于 (0,0,0) 中的原子之间的范数;

我像这样创建一个"占位符"高斯来存储前置中心的坐标

Gaussienne gaussienneP(0,(gaussienneA.GetX()+gaussienneB.GetX())/2.0,(gaussienneA.GetY()+gaussienneB.GetY())/2.0,(gaussienneA.GetZ()+gaussienneB.GetZ())/2.0);

当我称之为:

Szabo::norme(mygaussian,atome)

我得到的结果与调用时的结果不同:

/* using this constructor: Gaussienne(double alpha,double x, double y, double z) with a dummy alpha = 0; */
Szabo::norme(mygaussian,Gaussienne(0,atome.x,atome.y,atome.z)

幸运的是,我可以将我的结果与一些"佳能"程序进行比较,所以我知道具有两个高斯的范数函数返回了良好的结果,但另一个则不是。

谁能就这种奇怪的行为提供我和解释?谢谢

我认为错误在这里:

double Szabo::norme(Gaussienne gaussienne, Atome atome) {
    return sqrt(pow(gaussienne.GetX()-atome.x,2)+pow(gaussienne.GetY()-atome.y,2)+pow(gaussienne.GetY()-atome.y,2));
}

Y分量使用两次,应该是:

double Szabo::norme(Gaussienne gaussienne, Atome atome) {
    return sqrt(pow(gaussienne.GetX()-atome.x,2)+pow(gaussienne.GetY()-atome.y,2)+pow(gaussienne.GetZ()-atome.z,2));
}