本文主要是介绍【C语言笔记】【宏定义系列】 整数乘以分数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【C语言笔记】【linux宏定义系列】 整数乘以分数 mult_frac
linux宏定义系列内容。用于记录在linux kernel之中各式各样的宏定义☺。
宏定义说明
用于将整数乘以分数。可以避免不必要的溢出或精度损失。 该宏定义来自linux kernel 5.8。
实现代码
#define mult_frac(x, numer, denom)( \
{ \typeof(x) quot = (x) / (denom); \typeof(x) rem = (x) % (denom); \(quot * (numer)) + ((rem * (numer)) / (denom)); \
} \
)
宏定义中:
x表示要用于乘以的整数。
numer表示要用于乘以的分数的分子。
denom表示要用于乘以的分数的分母。
也就是
x × n u m e r d e n o m x \times \frac{numer}{denom} x×denomnumer
示例程序
示例程序用于计算 100 × 2 3 100 \times \frac{2}{3} 100×32,最后会等于66。
int main(int argc, char* argv[])
{int x, numer, denom;x = 100; //整数numer = 2; //分子denom = 3; //分母printf("mult_frac %d\n", mult_frac(x, numer, denom));return 0;
}
实现过程
要点
-
避免溢出
代码中通过整数先除分母,再乘以分子,避免出现溢出。
-
避免精度损失
代码中通过计算整数除以分母的余数,再将余数乘以分数,得到的数加到前面计算的结果上,避免了不必要的精度损失。
代码流程
-
quot = (x) / (denom)
整数x除以分数的分母denom,计算得到商,quot用于记录这个商。
-
rem = (x) % (denom)
整数x除以分数的分母denom,计算得到余数,rem用于记录这个余数。
-
quot * (numer)
整数x乘以第一步计算得到的商quot,实际上就是计算 x ÷ d e n o m × n u m e r x \div denom \times numer x÷denom×numer,整数先除分母,再乘以分子,用于避免整数相乘出现溢出。
-
(rem * (numer)) / (denom)
通过计算整数除以分母的余数,再将余数乘以分数,得到的数就是上一步先除后乘所损失的精度。这样就可以避免不必要的精度损失。
-
(quot * (numer)) + ((rem * (numer)) / (denom))
将第三步和第四步的数相加,得到结果。
[参考资料]
linux kernel 5.8
/include/linux/kernel.h
本文链接:https://blog.csdn.net/u012028275/article/details/118051599
这篇关于【C语言笔记】【宏定义系列】 整数乘以分数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!