C

时间:2017-07-29 12:34:14

标签: c algorithm computational-geometry

我有一些我从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 Date,它是根据用户输入日期计算的。

我还找到了一些有趣的资料来源,它描述了如何计算实时时间here

问题

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

// 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.;

你能解释一下为什么会出现这种情况吗?我看到了这个注释: Sidereal = fmod(Sidereal,360。)但我不明白为什么作者用长条件语句代替短代码。欢迎任何想法。

1 个答案:

答案 0 :(得分:1)

好吧,&#34;替换&#34;代码对负数做了不同的事情。这是证据:

#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;
}

正如Bob__在评论部分所说,&#34;替换&#34;代码将最终结果保留在区间[0.0,360.0)中。 fmod没有。

但是,我同意&#34;替换&#34;代码比必要的更复杂。但是你应该记住,并非所有编写代码的人都是程序员,而在航天工业(或相关)中,有许多物理学家需要在某些时候编写代码,他们有时会追求结果的正确性,而不是性能(没关系。)