2015-08-28 6 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. У вас есть источник функции модуля? –

+0

У меня, к сожалению, нет источника. Я не могу понять, почему автор написал модуль и не просто использовал мод. Но даже если бы он это сделал, это не целые числа, поэтому я не думаю, что мода подходит? – 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

Если вы хотите, чтобы вычислить Julian Day, Greenwich Mean звездное время и Местное среднее звездное время, может быть ниже, может помочь вам - написано в 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"