Linux c ++将秒(双精度)转换为毫秒,微秒,纳秒,皮秒

时间:2016-08-19 07:30:11

标签: c++ linux

我的设备在几秒钟内给我延迟(char*),像0.000003650000这样的值,我必须将该值转换为毫秒,微秒,纳秒或皮秒。 我在linux(c ++)的qt-creator中编写了一个应用程序。 我试图使用库chrono,但是我认为它只保留了很长的值,对于每种类型而且我总是丢失一些数据。 哪种方法最好这样做?

2 个答案:

答案 0 :(得分:4)

char*转换为std::string。检查小数点后面是否正好有12位数。使用unsigned long long将这些转换为std::strtoull(digits,10);皮秒数(请记住明确指定基数,否则前导零将使其认为是八进制数。)

如果您需要处理延迟> = 1s,请以相同的方式将小数点前的数字转换为秒数,并使用pico += seconds*(1000ull*1000*1000*1000);

将它们添加到皮秒中

最后,nanoseconds = (picoseconds + 500)/1000;

答案 1 :(得分:3)

以下是使用<chrono>以及here找到的一些简单实用程序执行此操作的方法:

#include "date/date.h"
#include <chrono>
#include <iostream>
#include <string>

using picoseconds = std::chrono::duration<long long, std::pico>;
using ldseconds = std::chrono::duration<long double>;

picoseconds
convert(const char* str)
{
    return date::round<picoseconds>(ldseconds{std::stold(std::string{str})});
}

int
main()
{
    auto t = convert("0.000003650000");
    using namespace date;
    std::cout << t << '\n';
    using namespace std::chrono;
    std::cout << duration_cast<nanoseconds>(t) << '\n';
    std::cout << duration_cast<microseconds>(t) << '\n';
    std::cout << duration_cast<milliseconds>(t) << '\n';
}

输出:

3650000ps
3650ns
3µs
0ms

详细说明

首先,您需要一些自定义chrono::duration

  1. picoseconds
  2. second基于long double
  3. 这些很容易构建,如类型别名picosecondsldseconds所示。第一个模板参数是您要使用的表示形式。第二个是std::ratio,表示编译时有理数,即duration的刻度周期。如果您没有提供(如ldseconds中所示),则默认值为ratio<1, 1>,这意味着秒。

    使用这两个自定义持续时间,我们现在可以轻松编写convert函数。它应输入const char*(假设以null结尾)并输出您预期的最佳duration(示例中为picoseconds)。

    使用std::stold将保留该号码的std::string转换为long double。然后将long double转换为ldseconds。最后使用"date/date.h"中的chrono ldseconds实用程序将picoseconds转换为round

    round现在也在C ++ 17中。因此,如果你有C ++ 17,你可以改为std::chrono::round,这样就无需"date/date.h"这个函数。

    客户端获得picosecond结果后,可以使用duration_cast(或在C ++ 17,roundfloor将其转换为他想要的任何单位,或ceil)。

    我使用"date/date.h"只是为了更容易打印出值。如果您愿意,可以在没有此实用程序的情况下打印出来,如下所示:

    std::cout << t.count() << "ps\n";