2017-07-29 107 views
1

我有一些代碼是從Javascript獲取的。該計劃的原始目的是計算太陽輻射。它計算太陽位置,距離太陽的地球距離,小時角,天頂角,方位角等。我試着分析我已經改寫成C的程序的一部分。這是計算恆星時間的部分。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是儒略曆,它是從用戶輸入的日期開始計算。

我還發現了一些有趣的來源,介紹瞭如何計算網站真實時間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

它試圖限制0.0和360.0 *之間的值,而不使用庫函數['fmod'](http://en.cppreference.com/w/c/numeric/math/fmod)。也許作者認爲會獲得更好的表現,並且知道'Sideral_time'並不太離譜。 –

+0

fmod - 計算除法運算的浮點餘數...爲什麼不使用'SideReal%360'?用這個簡短的陳述代替代碼是否合適? – user1141649

+0

@ user1141649 SideReal是double類型的,因此模數將無法正常工作。 –

回答

1

那麼,「替代」代碼對負數做了一些不同的事情。這是證明:

#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__在註釋部分稱,「替代」代碼保持最終的結果在區間[0.0,360.0)fmod沒有。

但是,我同意「替換」代碼比必要更復雜。但是你應該記住,不是每個人編寫代碼都是程序員,在空間行業(或者相關的),有很多物理學家需要在某個時候編寫代碼,他們有時會爲了結果的正確性而不是性能(這很好)。