我一直在读点浮点数学就像一个小型的Arduino微控制器坏了。 因此,在尝试使用更少的花车时,我发现了一些奇怪的东西。
// Baseline float brightness = 0.05; int result = someInt * brightness; // Takes about twice as long int brightness = 20; int result = someInt / brightness;
两者都有相同的目标,将整数减少到原始值的二十分之一。 但在进行数学优化时,我不确定为什么浮点数更快。
原生AVR(arduino)没有乘法或除法函数,更不用说本机浮点处理。 当你乘以它时,它基本上只是一堆加法。 使用减法计算除法更加困难(不能太远),找到余数 – 如果浮点数然后从余数计算分数,其本身就是加/减和减法的总和。
浮点数也很慢/很差,因为C库必须弄清楚所有的十进制处理,只有在内部使用整数。 你会注意到任何使用浮点数的东西都会大大增加你的程序大小(添加浮点库)你会发现浮点除法甚至比整数除法更慢。
不知何故,浮点库在乘法中比整数除法更有效
您也可以使用乘法和移位而不是除法
int brightness = 20; int multer = 256/20; int result = (someInt * multer) >> 8;
越多的位用于“multer”越精确的结果。
你正在比较乘以除数。 苹果和梨。
要除以20
,可以使用整数乘以floor(2^k/5)
或ceiling(2^k/5)
,然后右移k+2
位。 选择不会导致溢出的最大k
。
你可以只使用位移来划分。 看看https://stackoverflow.com/a/19076173/2193968它有一个除以10的函数:
unsigned divu10(unsigned n) { unsigned q, r; q = (n >> 1) + (n >> 2); q = q + (q >> 4); q = q + (q >> 8); q = q + (q >> 16); q = q >> 3; r = n - (((q << 2) + q) << 1); return q + (r > 9); }
所以这应该除以20:
unsigned divu20(unsigned n) { return divu10(n)>>1; }
位移应该比乘法或除法指令快 – 特别是如果(如EkriirkE已经说过)“原生AVR(arduino)没有乘法或除法函数”
以上就是c/c++开发分享为什么int * float比int / int快?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/559882.html