C如何计算没有浮点精度的百分比(千)

Ash*_*lax 5 c embedded floating-point int percentage

您如何计算从2个int值到一个表示一个百分比的int值的百分比(千位,以获得更高的准确性)?

背景/用途:使用没有FPU的处理器,浮点计算的时间要长100倍。

int x = 25;
int y = 75;
int resultPercentage; // desire is 250 which would mean 25.0 percent

resultPercentage = (x/(x+y))*1000; // used 1000 instead of 100 for accuracy
printf("Result= ");
printf(resultPercentage);
Run Code Online (Sandbox Code Playgroud)

输出:

结果= 0

当我真正需要的是250时,并且不能使用任何浮点计算。

正常的fpu计算示例:

int x = 25;
int y = 75;
int resultPercentage; // desire is 250 which would mean 25.0 percent

resultPercentage = (int)( ( ((double)x)/(double(x+y)) ) *1000); //Uses FPU slow

printf("Result= ");
printf(resultPercentage);
Run Code Online (Sandbox Code Playgroud)

输出:

结果= 250

但是输出是以使用浮点计算为代价的。

chu*_*ica 5

resultPercentage = (x/(x+y))*1000;不能因为工作(x/(x+y))很可能0还是1在multiplcation之前*1000发生。代替:

对于一个圆形的无符号整数计算x/(x+y),让a = xb = x+y再找到a/b使用:

result = (a + b/2)/b;
Run Code Online (Sandbox Code Playgroud)

为圆形的无符号整数百分比%的计算a/b使用

result = (100*a + b/2)/b;
Run Code Online (Sandbox Code Playgroud)

对于四舍五入的无符号整数permil‰a/b使用计算

result = (1000*a + b/2)/b;
Run Code Online (Sandbox Code Playgroud)

对于舍入的无符号整数permyriad?a/b使用计算

result = (10000*a + b/2)/b;
Run Code Online (Sandbox Code Playgroud)

@ H2CO3井指出了吃掉整数范围的问题,因此乘法和可能需要使用更宽的整数(longlong longx+y

result = (100L*a + b/2)/b;
Run Code Online (Sandbox Code Playgroud)

当然要更换

// printf(resultPercentage);
printf("%d\n", resultPercentage);
Run Code Online (Sandbox Code Playgroud)