长双精度的替代品,在Windows和Unix上具有相同的精度

Alternative to long double which has the same Precision on Windows and Unix?

本文关键字:精度 Unix 替代品 双精度 Windows      更新时间:2023-10-16

我正在编写一个工具,该工具允许您将特定日期格式(Unix Time,HFS,Fat-Time,...)的给定数字(Dec,Bin,Hex)转换为人类可读的日期字符串。

我在使用 Windows OLE-Date 时遇到问题,它以双精度值表示日期和时间。现在我在Windows和Unix中得到了不同的输出。它只是Outputdate的第二个差异,但我想在Windows和Unix平台上生成相同的输出。

我正在使用long double来存储值。我知道Visual Studio C++编译器和 gcc 使用不同的精度进行long double。是否有在两个平台上使用相同的精度的替代方案?

当Windows OLE-Date是double时,为什么需要使用long double?只需将所有平台使用double,它仍然可以使用数十年甚至几个世纪

如果确实需要更高的分辨率,那么有很多解决方案

  • 使用具有 2 个字段的结构作为秒和秒的小数部分,就像struct timespec

    struct timespec {
        time_t    tv_sec;
        long      tv_nsec;
    };
    

    返回双精度时,只需将其拆分为 int 部分和小数部分,并将它们内部存储在结构中。需要时将结构转换回双精度

  • 在所有平台上使用 80 位扩展精度long double。在Windows上,这可以通过使用其他编译器(如GCC,Clang或ICC)轻松完成。它们允许您更改格式或long double,例如在 GCC 中有-mlong-double-64/80/128-m96/128bit-long-double标志,ICC 具有/Qlong-double