我有三种计算方法来获得当前的cpu频率:(每秒的周期数)
_initialCycles = rdtsc(); //rdtsc function calculates the cpu cycles since init.
first:
------
unsigned int initialMillisec = (_timeVal.tv_sec)*1000+(_timeVal.tv_usec)/1000;
unsigned int cps1 = ((_initialCycles / initialMillisec) * 1000);
second:
-------
double initialMillisec2 = (_timeVal.tv_sec)*1000+(_timeVal.tv_usec)/1000.0;
unsigned int cps2 = (unsigned int)(_initialCycles / initialMillisec2 * 1000.0);
third:
------
unsigned long long initialUsec3 =
((unsigned long long)(_timeVal.tv_sec))*1000000+_timeVal.tv_usec) ;
unsigned int cps3 = (unsigned int)((_initialCycles / initialUsec3)* 1000000.0);问题是,cps1 cps2 cps3假设有相同的值,或多或少..但他们不会。我明白:
cps1 = 2824048000
cps2 = 3824609671
cps3 = 8000000有人知道为什么吗?
发布于 2012-01-16 23:49:30
整数类型的问题在于四舍五入。当你被某个大数字除以时,你丢失了有效数字。因此,您应该更改乘法和除法之间的操作顺序。首先,你应该乘以1,000(或者在long long的情况下是1000000 ),然后再除法。
以下是一些整数精度下降的例子:
321 / 20 * 20 = 320;
321 / 75 * 75 = 300;
321 / 112 * 112 = 224
发布于 2012-01-16 23:47:31
同时还有许多其他线程和进程在运行,OS调度程序可能会对这种测量频率的方法感到恐惧。
尝试使用"cpufreq“实用程序来准确地获取当前的时钟速度。
发布于 2012-01-16 23:47:03
运算符优先级和隐式转换。
当然,您需要确保运算符按照您希望的顺序进行计算。我最好的建议是:如果你需要三思而后行才能知道没有括号的顺序,那就加上括号。
然后:你需要提前将整数转换成浮点数,否则你最终会得到整数除法和同样的舍入误差。
unsigned int initialMillisec = _timeVal.tv_sec*1000 + _timeVal.tv_usec/1000;
unsigned int cps1 = (1.0 * _initialCycles / initialMillisec) * 1000.0;将是我的建议
https://stackoverflow.com/questions/8882183
复制相似问题