我的设备在几秒钟内给我延迟(char*
),像0.000003650000
这样的值,我必须将该值转换为毫秒,微秒,纳秒或皮秒。
我在linux(c ++)的qt-creator中编写了一个应用程序。
我试图使用库chrono
,但是我认为它只保留了很长的值,对于每种类型而且我总是丢失一些数据。
哪种方法最好这样做?
答案 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
:
picoseconds
和second
基于long double
。这些很容易构建,如类型别名picoseconds
和ldseconds
所示。第一个模板参数是您要使用的表示形式。第二个是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,round
,floor
将其转换为他想要的任何单位,或ceil
)。
我使用"date/date.h"
只是为了更容易打印出值。如果您愿意,可以在没有此实用程序的情况下打印出来,如下所示:
std::cout << t.count() << "ps\n";