添加/减去floats / ints linux C

时间:2012-03-04 18:02:47

标签: c linux floating-point

(可以跳过这部分只是对下面代码的解释。我的问题在代码块下面。)

喜。我正在尝试根据linux计算机使用的带宽限制循环周期。我每秒读取一次/ proc / net / dev并跟踪2个变量中传输的字节数。一个是最后一次检查,另一个是最近的时间。从那里减去最后一个中的最近一个来计算在1秒内发送了多少字节。

从那里我有变量max_throttle,throttle,max_speed和sleepp。

这个想法是根据使用的带宽增加或减少sleepp。带宽越小,延迟越低,越长越长。

我目前在处理浮动和整数时遇到问题。如果我将所有变量设置为整数max_throttle变为0总是无论我将其他变量设置为什么,即使我初始化它们。

即使我的if语句说“如果sleepp小于0然后将其返回0”,它会越来越深入到负数,然后在使用0带宽的情况下达到-540的水平。

和if(ii& 0x40)用于速度和使用控制。在我的应用程序中将没有1秒睡眠,所以这段代码允许我限制sleeppp每20-30次迭代改变一次。虽然我也遇到了问题,在2X迭代之后,当它触发它时,它继续触发每次迭代,而不是仅仅为真一次,然后在20-30次迭代后再次为真。

为我的变量问题编辑::更简单的测试演员。

#include <stdio.h>

int main()
{
int max_t, max_s, throttle;

      max_s = 400;
      throttle = 90;
      max_t = max_s * (throttle / 100);
      printf("max throttle:%d\n", max_t);


return 0;
}

2 个答案:

答案 0 :(得分:4)

在C中,operator /是仅与整数一起使用时的整数除法。因此,90/100 = 0.为了使用整数进行浮点除法,首先将它们转换为浮点数(或双重或其他fp类型)。

max_t = max_s * (int)(((float)throttle / 100.0)+0.5);

+ +5在转换为int之前进行舍入。你可能想要考虑一些标准的地板功能,我不知道你的用例。

另请注意,100.0是浮点字面值,而100则是整数字面值。所以,尽管它们看起来相同,但它们并非如此。

答案 1 :(得分:1)

正如kralyk所指出的,C 90/100的整数除法是0。但是不是使用浮点数就可以使用整数...只需在乘法后进行除法(注意省略括号):

max_t = max_s * throttle / 100;

这给你一般的想法。例如,如果您想要这种舍入kralyk提及,请在进行划分之前添加50

max_t = (max_s * throttle + 50) / 100;