Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加/减浮点/ints linux C_C_Linux_Floating Point - Fatal编程技术网

加/减浮点/ints linux C

加/减浮点/ints linux C,c,linux,floating-point,C,Linux,Floating Point,(我可以跳过这部分,只是对下面代码的解释。我的问题在代码块下。) 嗨。我试图根据linux计算机使用的带宽限制循环周期。我每秒读取一次/proc/net/dev,并跟踪在两个变量中传输的字节。一个是最后一次检查,另一个是最近一次。从中减去最近的一个,计算在1秒内发送了多少字节 从那里我有变量max_throttle、throttle、max_speed和sleepp 这个想法是根据所使用的带宽来增加或减少sleepp。带宽越小,延迟越低,越长,延迟越高 我目前在处理浮点数和整数时遇到了一些问题。

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

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

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

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

我目前在处理浮点数和整数时遇到了一些问题。如果我将所有变量设置为ints max_,则无论我将其他变量设置为什么,即使我对它们进行了初始化,油门始终变为0

而且,即使我的if语句说“如果sleepp小于0,则将其返回到0”,它也会越来越深入到负片中,然后在使用0带宽的情况下,在大约-540处趋于平稳

if(ii&0x40)用于速度和使用控制。在我的应用程序中,不会有1秒的睡眠,所以这段代码允许我限制睡眠时间每20-30次改变一次。虽然我也有一个问题,在2次迭代后,当它触发时,它会继续在每次迭代后触发,而不是仅为真一次,然后在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;
}
#包括
int main()
{
int max_t,max_s,节气门;
最大值=400;
节流阀=90;
max_t=max_s*(节气门/100);
printf(“最大节流阀:%d\n”,最大值);
返回0;
}

在C语言中,运算符/仅与整数一起使用时是整数除法。因此,90/100=0。为了对整数进行浮点除法,首先将它们转换为浮点(或双精度浮点或其他浮点类型)

在转换为int之前,0.5是舍入的。您可能需要考虑一些标准的地板功能,我不知道您的用例。


还要注意,100.0是一个浮点文本,而100是一个整数文本。因此,虽然它们看起来相同,但实际上不同。

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

在转换为int之前,0.5是舍入的。您可能需要考虑一些标准的地板功能,我不知道您的用例。


还要注意,100.0是一个浮点文本,而100是一个整数文本。因此,尽管它们看起来相同,但它们却不同。

正如克雷克指出的那样,C的
90/100
整数除法是
0
。但是,您可以使用整数而不是浮点数…只需在乘法后进行除法(注意省略括号):

这给了你一个大概的想法。例如,如果您想要kralyk提到的那种舍入,请在进行除法之前添加
50

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

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

这给了你一个大概的想法。例如,如果您想要kralyk提到的那种舍入,请在进行除法之前添加
50

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

请创建一个更简单的测试用例,最好不要超过10行。与
fopen
sleep
等相关的所有内容可能都是无关的,应该删除。完成。添加了一个更简单的测试用例。@bobmoch:谢谢。现在处理起来容易多了!修正了我阅读负数时的睡眠问题。它确实被设置为0,我只是把调试printf语句放错了位置。仍在试图找出整数返回0的原因。如果它们是十进制数,我想它们会向上或向下取整。请创建一个更简单的测试用例,理想情况下不超过10行。与
fopen
sleep
等相关的所有内容可能都是无关的,应该删除。完成。添加了一个更简单的测试用例。@bobmoch:谢谢。现在处理起来容易多了!修正了我阅读负数时的睡眠问题。它确实被设置为0,我只是把调试printf语句放错了位置。仍在试图找出整数返回0的原因。我原以为如果它们是十进制数,它们会向上或向下取整。事实上,如果两个操作数中只有一个是双精度的,这就足够了,所以如果你已经写了
100.
,你就可以避免
(float)
强制转换。我试着用它,但它没有返回正确的值。我想做的是获得90%的最大值。(例如:400将返回360,但在本代码中它返回400)。虽然我认为我找到了一种让浮动对我有利的方法。@MatteoItalia是的,没错,虽然它只是一个符号,但左侧的int无论如何都会被铸造。@bobmoch那么你需要做
max_s*9/10.0
max_s*(9.0/10.0)
取决于您的精度和整数宽度要求。实际上,如果两个操作数中只有一个是
/
浮点
,就足够了,因此如果您已经写入
100.
,就可以避免使用
(浮点)
强制转换。我尝试过使用这个方法,但它没有返回正确的值。我想做的是获得90%的最大值。(例如:400将返回360,但在本代码中它返回400)。虽然我认为我找到了一种让浮动对我有利的方法。@MatteoItalia是的,没错,虽然它只是一种符号,但左侧的int无论如何都会被铸造。@bobmoch好吧,你需要做
max_s*9/10.0
max_t = (max_s * throttle + 50) / 100;