C语言中的恒星实时计算

C语言中的恒星实时计算,c,algorithm,computational-geometry,C,Algorithm,Computational Geometry,我有一些代码是从Javascript中提取的。该计划的最初目的是计算太阳辐射。它计算太阳位置、地球与太阳的距离、小时角、天顶、方位角等。我试图分析程序的一部分,我已经重写为C。这是计算恒星实时性的部分 仅用于上下文目的: // Sidereal time (Theta0) double GMST = 280.46061837+360.98564736629*( i->JulianDate-2451545.); // Sidereal_time = GMST + 0.000387

我有一些代码是从Javascript中提取的。该计划的最初目的是计算太阳辐射。它计算太阳位置、地球与太阳的距离、小时角、天顶、方位角等。我试图分析程序的一部分,我已经重写为C。这是计算恒星实时性的部分

仅用于上下文目的:

  // Sidereal time (Theta0)
  double GMST = 280.46061837+360.98564736629*( i->JulianDate-2451545.);
  // Sidereal_time = GMST + 0.000387933*T2 - T3/38710000
  double Sidereal_time = GMST+0.000387933*T*T
       -T*T*T/38710000.;
注:i->JulianDate为Julian日期,从用户输入日期开始计算

我还发现了一些有趣的源代码,其中描述了如何计算sitereal time

问题

现在是代码部分,我想知道的是:

// Replacement code for Sidereal=fmod(Sidereal,360.)
double S_save=Sidereal_time/360.;

if (S_save < 0.) Sidereal_time=Sidereal_time-ceil(S_save)*360.;
else Sidereal_time=Sidereal_time-floor(S_save)*360.;

if (Sidereal_time < 0.) Sidereal_time+=360.;
//恒星的替换代码=fmod(恒星,360.)
双S_保存=恒星时间/360。;
如果(S_save<0.)恒星时间=恒星时间-ceil(S_save)*360。;
否则恒星时间=恒星时间层(S\U保存)*360。;
如果(恒星时间<0.)恒星时间+=360。;
你能解释一下为什么会出现这种情况吗?我看到了注释:Sidereal=fmod(Sidereal,360.),但我不明白作者为什么用长的条件语句块替换短代码。欢迎任何意见。

嗯,“替换”代码对负数有不同的作用。这就是证据:

#include <iostream>
#include <cmath>
using namespace std;

double fmod360_alternative(double Sidereal_time) {
    double S_save=Sidereal_time/360.;

    if (S_save < 0.) Sidereal_time=Sidereal_time-ceil(S_save)*360.;
    else Sidereal_time=Sidereal_time-floor(S_save)*360.;

    if (Sidereal_time < 0.) Sidereal_time+=360.;

    return Sidereal_time;
}

int main() {
    double Sidereal_time = -100;
    cout << fmod(Sidereal_time,360.0) << endl;   // result: -100
    cout << fmod360_alternative(Sidereal_time) << endl; // result: 260
    return 0;
}
#包括
#包括
使用名称空间std;
双fmod360_备选方案(双恒星时间){
双S_保存=恒星时间/360。;
如果(S_save<0.)恒星时间=恒星时间-ceil(S_save)*360。;
否则恒星时间=恒星时间层(S\U保存)*360。;
如果(恒星时间<0.)恒星时间+=360。;
返回恒星时间;
}
int main(){
双星时=-100;

它是否试图在不使用库函数的情况下将值限制在0.0和360.0之间。也许作者认为可以获得更好的性能,并且知道
Sideral\u time
距离限制并不太远。fmod-计算除法运算的浮点余数…为什么不只使用
SideReal%360
?Could是否适合用这个简短的语句替换代码?@user1141649 SideReal的类型是double,所以模数不能很好地工作。我已经测量了使用fmod和不同的方式需要多长时间,在所有情况下,我在调试模式下都得到了0.000003s。没有优化。所以我看不到性能的差异。但是我在这里读到了fmod非常慢:(我在0.3E05的同一时间测试了这里介绍的方法)。