如何避免警告C4244:从'ULONGLONG'转换为"双倍",可能丢失数据
How can avoid warning C4244: conversion from 'ULONGLONG' to 'double', possible loss of data
我使用的是Win32 x64环境
也请转到下面的链接
我已经从这个链接找到了答案收集进程的CPU使用情况
在Windows标准的第一个答案下,您可以看到如下代码片段:
double getCurrentValue(){
FILETIME ftime, fsys, fuser;
ULARGE_INTEGER now, sys, user;
double percent;
GetSystemTimeAsFileTime(&ftime);
memcpy(&now, &ftime, sizeof(FILETIME));
GetProcessTimes(self, &ftime, &ftime, &fsys, &fuser);
memcpy(&sys, &fsys, sizeof(FILETIME));
memcpy(&user, &fuser, sizeof(FILETIME));
percent = (sys.QuadPart - lastSysCPU.QuadPart) +
(user.QuadPart - lastUserCPU.QuadPart);
percent /= (now.QuadPart - lastCPU.QuadPart);
percent /= numProcessors;
lastCPU = now;
lastUserCPU = user;
lastSysCPU = sys;
return percent * 100;
}
//--------------------------- FOCUS -----------------------------//
percent = (sys.QuadPart - lastSysCPU.QuadPart) +(user.QuadPart - lastUserCPU.QuadPart); // ---(1)
percent /= (now.QuadPart - lastCPU.QuadPart); // ---(2)
percent /= numProcessors; // --- (3)
如第行(1)将ULONGLONG(无符号长-长)赋值给双给定编译器warning C4244: conversion from 'ULONGLONG' to 'double', possible loss of data
- 因此@Line#(1),(2)&(3)如何保证
double precent
数据的值
(由于Ulonglong 64位积分数据转换为64位浮点数据)
- 有时此
precent
值的值会超过10.00作为CPU使用率的时间戳
假设您在短时间内调用getCurrentValue
函数,则可以安全地将值强制转换为两倍。您还可以通过按年份分隔的通话来检查极端情况。
ULONGLONG used = (sys.QuadPart - lastSysCPU.QuadPart) + (user.QuadPart - lastUserCPU.QuadPart);
ULONGLONG elapsed = (now.QuadPart - lastCPU.QuadPart);
if ( elapsed == 0 )
{
// Now it is imposible, but it could be problem in future :)
// Do something sane here. For example restart calculation.
}
else
{
double percent = ( (double)used / (double)elapsed ) / numProcessors * 100.0;
// Clamp value for rounding errors in our or system code.
if ( percent > 100.0 )
percent = 100.0;
if ( elapsed >= ( 1ull << 53 ) || used >= ( 1ull << 53 ) )
{
// Set some flag that result could be not precise.
// For 'elapsed' this needs 28 years.
// 'used' could kick earlier: 28/num_processors years.
// But if you realy need only 4 or 5 digits you can
// ignore this case.
}
}
相关文章:
- 我想知道长双倍和双倍之间的区别
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- 按值 C++ 返回时进行双倍移动
- 求和 int 乘以双倍时的欠/过近似
- 从'size_t'转换为"常量双倍",可能会丢失数据
- 二叉搜索不收敛为双倍
- 将一个双倍值乘以10会发生什么
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- 双吨级 - 从单级过渡到双倍级
- 如何将包含指数的 QString 转换为C++中的双倍?
- 防止在字符数组中输入双倍空格在 C++
- 将双倍转换为 LPARAM 的麻烦
- 为什么双精度数据类型在C++中出错?
- 现代计算机上的双倍和浮点内存分配
- 将 CSV 文件中的双倍值C++到矢量中
- 如何避免警告C4244:从'ULONGLONG'转换为"双倍",可能丢失数据
- 数据类型在 CPP 中将 int 转换为双倍
- 从C++中的.csv文件中读取双倍数据
- 双倍到 std::cout 截断数据
- 为什么 qjsonvalue 到双倍转换会导致数据丢失