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
但是输出是以使用浮点计算为代价的。
resultPercentage = (x/(x+y))*1000;
不能因为工作(x/(x+y))
很可能0
还是1
在multiplcation之前*1000
发生。代替:
对于一个圆形的无符号整数计算x/(x+y)
,让a = x
和b = 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井指出了吃掉整数范围的问题,因此乘法和可能需要使用更宽的整数(long
,long long
)x+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)