0

1秒間のCPU使用率の合計を出力する小さなプログラムをCで作成しています。ほとんどの部分で機能していますが、適切な数値を計算しますが、workOverをtotalOver * 100で除算する最終的な計算では、常に0が出力されます。理由はわかりません。どんな助けでも素晴らしいでしょう。コードは以下のとおりです。

#include <stdio.h>
#include <glibtop.h>
#include <glibtop/cpu.h>
#include <unistd.h>
#include <math.h>

unsigned long cpu1Total, cpu1User, cpu1Nice, cpu1Sys, cpu1Work;
unsigned long cpu2Total, cpu2User, cpu2Nice, cpu2Sys, cpu2Work;
unsigned long workOver, totalOver, cpuTotal;

int main(){

    glibtop_init();

    glibtop_cpu cpu;
    glibtop_get_cpu (&cpu);

    cpu1Total = cpu.total;
    cpu1User = cpu.user;
    cpu1Nice = cpu.nice;
    cpu1Sys = cpu.sys;

    cpu1Work = cpu1User + cpu1Nice + cpu1Sys;

    usleep ( 1000000 ) ;

    glibtop_get_cpu (&cpu);

    cpu2Total = cpu.total;
    cpu2User = cpu.user;
    cpu2Nice = cpu.nice;
    cpu2Sys = cpu.sys;

    cpu2Work = cpu2User + cpu2Nice + cpu2Sys;

    workOver = cpu2Work - cpu1Work;
    totalOver = cpu2Total - cpu1Total;

    cpuTotal = workOver / totalOver * 100;

    printf("Cpu Idle : %ld \n", cpuTotal);

    return 0;
}
4

2 に答える 2

3

部門内の変数は整数として宣言されています。問題は、2つの整数を除算すると、小数値が得られないことです。これは、分母が分子よりも大きい場合、結果は0になることを意味します。

整数除算は、浮動小数点の結果を自動的に生成しません。

これを修正するには、数式内の変数の少なくとも1つを浮動小数点数として再宣言するか、計算にキャストすることもできます。

于 2012-12-21T00:02:47.073 に答える
1

除算を使用するunsigned long必要があるときに使用しています。Aまたは任意の整数値は小数点を処理できないため、数値が0 <x <1の場合、小数点を切り落とすと0のままになります。floatdoublelong

于 2012-12-21T00:03:24.913 に答える