我有一些我从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。)但我不明白为什么作者用长条件语句代替短代码。欢迎任何想法。
答案 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;代码比必要的更复杂。但是你应该记住,并非所有编写代码的人都是程序员,而在航天工业(或相关)中,有许多物理学家需要在某些时候编写代码,他们有时会追求结果的正确性,而不是性能(没关系。)