【问题标题】:Obtaining 17 digits precision of Julian datetime in C++在 C++ 中获取 Julian 日期时间的 17 位精度
【发布时间】:2022-09-26 16:00:09
【问题描述】:

我正在尝试将一些 JavaScript 代码转换为 C++ 以获得具有 17 位精度的 Julian 日期时间。 JS 代码能够给我这个精度,但它在 C++ 中的类似代码给出的值不超过 7 位。这 17 位精度是绝对需要的,因为它有助于以更高的精度实时查找天体的高度和方位角。

这是JS代码。

function JulianDateFromUnixTime(t){
    //Not valid for dates before Oct 15, 1582
    return (t / 86400000) + 2440587.5;
}

function setJDToNow(){
    const date=new Date();
    const jd=JulianDateFromUnixTime(date.getTime());
    document.getElementById(\"jd\").value=jd;
}

在 HTML 代码中调用它,如下所示 <tr><td align=right>Julian Date:</td><td><input type=text id=\"jd\" value=\"2459349.210248739\"></td><td><input type=button value=\"Now\" onclick=\'setJDToNow();\'></td></tr> 给出值 2459349.210248739


这是C++代码

#include <chrono>
#include <cstdint>
#include <iostream>

uint64_t timeSinceEpochMillisec() {
  using namespace std::chrono;
  return duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
}

uint64_t JulianDateFromUnixTime(uint64_t t){
    //Not valid for dates before Oct 15, 1582
    return (t / 86400000) + 2440587.5;
}

int main() {
  std::cout << JulianDateFromUnixTime(timeSinceEpochMillisec()) << std::endl;
  return 0;
}

这给出了2459848 作为值。

问题:如何获得 17 位精度?

注意:我使用的 GCC 版本是 MSYS2-MINGW-64 GCC 12.1.0

标签: c++ c++14 chrono julian-date


【解决方案1】:

乍一看,我在这里看到三个问题:

  1. 你的 Julian Date 是一个浮点数,所以你的函数的结果应该是double,而不是uint64_t,它是一个无符号整数;

  2. 您希望 t / 86400000 成为浮点除法,而不是丢弃小数部分的欧几里得除法。有几种方法可以做到这一点,最简单的方法是除以double,即t / 86400000.0。有些人可能认为这太微妙了,因此更喜欢double(t) / 86400000.0 甚至static_cast&lt;double&gt;(t) / 86400000.0

  3. 即使您返回double,显示格式也不会是您想要的格式。您应该使用std::fixedstd::setprecision 设置它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多