2015-08-28 25 views
1

我想將一些Pascal代碼翻譯成C++代碼。我試圖弄清楚如何翻譯這部分。Pascal中的模量

Function ThetaG_JD(jd : double) : double; 
var 
UT,TU,GMST : double; 
begin 
**UT := Frac(jd + 0.5);** 
jd := jd - UT; 
TU := (jd - 2451545.0)/36525; 
GMST := 24110.54841 + TU * (8640184.812866 + TU * (0.093104 - TU * 6.2E-6)); 
**GMST := Modulus(GMST + 86400.0*1.00273790934*UT,86400.0);** 
ThetaG_JD := twopi * GMST/86400.0; 
end; {Function ThetaG_JD} 

我特別遇到了我粗體制作的兩條線。我如何將其轉換爲C++?非常感謝。

+0

這似乎是一個函數調用,因爲Pascal中的模數是'MOD'運算符。你有Modulus功能的來源嗎? –

+0

我不幸沒有消息來源。我無法弄清楚爲什麼作者寫出了模數,並沒有使用mod。但即使他這樣做,這些都不是整數,所以我不認爲mod是合適的? – user2990129

+2

你可以假設它是'mod'的浮點變體,它將翻譯爲'fmod()',但不要引用我;-)類似地'Frac()'可能只返回小數部分,但真的這是任何人的猜測。如果你沒有所有的源代碼,你不能正確地完成這項工作。 – EJP

回答

0

在C++中等同的功能將是:

fmod獲得浮點模量

modf打破浮點項成其級分和不可分割的組成部分(的Frac當量)。

+0

我現在想了解modf。會用'ut = modf(jd + .5,&fracPart)'這樣的東西代替那條線嗎?' ? – user2990129

+1

差不多,第二個參數是整數部分,所以你應該命名你的虛擬變量'intPart'。 'ut = modf(jd + 0.5,&intPart);' –

0

如果要計算朱利安日,格林威治恆星時當地平均恆星時,也許下面可以幫你 - 寫在PowerShell中

<# 
    .Synopsis 
    Astronomy calculations 

    .Description 
    Some helper functions to calculate: 
    - Julian Day, 
    - Greenwich Mean Sidereal time, 
    - Local Mean Sidereal Time. 
#> 
cls 

# https://en.wikipedia.org/wiki/Julian_day#Julian_day_number_calculation 
function Get-JulianDay 
{ 
    param ([System.DateTime]$dt) 
    $year = $dt.Year 
    $month = $dt.Month 
    $day = $dt.Day 
    $hour = $dt.Hour 
    $minute = $dt.Minute 
    $second = $dt.Second 
    $a = [System.Math]::Floor((14 - $month)/12) 
    $y = $year + 4800 - $a 
    $m = $month + 12 * $a - 3 
    $JDN = $day + [System.Math]::Floor((153 * $m + 2)/5) + 365 * $y + [System.Math]::Floor($y/4) - [System.Math]::Floor($y/100) + [System.Math]::Floor($y/400) - 32045 
    $JD = $JDN + ($hour - 12)/24 + $minute/1440 + $second/86400 
    return ($JD) 
} 

# https://en.wikipedia.org/wiki/Sidereal_time#Definition 
# http://aa.usno.navy.mil/faq/docs/GAST.php 
function Get-GMST 
{ 
    param ([double]$JD) 
    $D = $JD - 2451545.0 
    $GMST = 18.697374558 + 24.06570982441908 * $D 
    return ($GMST % 24) 
} 

function Get-LMST 
{ 
    param ([double]$gmst, [double]$longitude) 
    return ($gmst + $longitude/15.0) 
} 

# Test above functions 
$current = (Get-Date).ToUniversalTime() 
$jd = Get-JulianDay -dt $current 
$gmst = Get-GMST -JD $jd 
$longitude = 17.668487800 
$lmst = Get-LMST -gmst $gmst -longitude $longitude 
$lst = [timespan]::FromHours($lmst).ToString() 
Write-Host "Local mean sidereal time: $lst"