C atmega2560大整数分部

时间:2014-05-16 12:33:12

标签: c integer-division

所以我想知道atmega2560以及一般情况下的分工成本: 我们说我有类似的东西

    unsigned long long a=some-large-value;
    unsigned long long b=some-other-large-value;
    unsigned long result=(a-b)/A_CONSTANT
    //A_CONSTANT i.e. 16

实际需要多长时间?我们是在谈论hundrets还是数千个周期?如果我将除法改为乘法,那么它是否会有所不同,即如此

    unsigned long result=(a-b)*1/A_CONSTANT

我想在时间关键型应用程序中使用它来计算时间跨度,该时间跨度用于确定何时执行程序的另一部分。假设划分需要太多时间,我还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

这实际上取决于你的A_CONSTANT以及IMO的编译器有多好。

我查了一下芯片,它显然是8位或16 MHz的8位处理器。

因此,如果你的分工是微不足道的话,我认为那些unsigned long long整数是最大的障碍。

为此,它必须是2的幂(如2,4,8,16等)。那么会发生什么,将是一个优化,用一个简单的右移代替整个分区,这将在更少的周期内完成。

切换到乘法不会给你带来任何好处。您至少会遇到精度问题,而您当前的代码会始终产生结果0,除非A_CONSTANT1(因为您显然正在进行整数除法,其中结果向下舍入。)

那么做什么或是否考虑这个优化的东西在很大程度上取决于A_CONSTANT的实际价值。

解决此问题(或比较解决方案)的最简单方法可能是比较生成的汇编代码,因为它将是实际处理的最终结果。纯粹基于理论对此进行优化是相当复杂的,甚至可能使您错误或误导结果。

答案 1 :(得分:0)

AVR指令集本身没有除法运算,因此在注释中提到它们都指出了您使用的编译器如何实现此操作。

您可能希望查看生成的计算机指令,以查看实际生成的内容并考虑可能的优化。

Google上有很多关于整数除法的不同实现的信息,例如this

同样非常好source的信息。