Tag: 除法

在x86上以32位块实现类似学校的划分

假设我有两个大数字(定义如下),我想通过回退到x86 avaliable算法来实现它们的划分 0008768376 – 1653656387 – 0437673667 – 0123767614 – 1039873878 – 2231712290/0038768167 – 3276287672 – 1665265628 C = A / B 这些数字存储为32位无符号整数的向量。 第一个,A,是6-unsigned-int向量,B是3-unsigned-int长向量[这个字段中的每一个我自己命名为’digit’或’field’] 得到的C将是一些3-unsigned-int向量,但要计算它我需要回退到一些可用的x86(32位模式,虽然我也可以听到x64,但这是次要的)算术 告诉我如何计算至少第一个,最重要的C结果矢量字段.. 怎么做?

通过非常数除数进行矢量化整数除法的最快方法

基于这个问题的答案/评论,我用gcc 4.9.2(MinGW64)编写了一个性能测试来估计多个整数除法的哪种方式更快,如下: #include // SSE2 static unsigned short x[8] = {0, 55, 2, 62003, 786, 5555, 123, 32111}; // Dividend __attribute__((noinline)) static void test_div_x86(unsigned i){ for(; i; –i) x[0] /= i, x[1] /= i, x[2] /= i, x[3] /= i, x[4] /= i, x[5] /= i, x[6] /= i, x[7] /= i; } __attribute__((noinline)) static […]

为什么即使我使用浮子,5/2也会产生’2’?

我输入了以下代码(没有编译问题或任何东西): float y = 5/2; printf(“%f\n”, y); 输出只是: 2.00000 我的数学没错,是吗? 或者我错了/运营商? 这意味着鸿沟不是吗? 5/2应该等于2.5? 任何帮助是极大的赞赏!

有效地实现floored / euclidean整数除法

地板划分是指结果总是向下(朝-∞),而不是0: 是否有可能在C / C ++中有效地实现floored或euclidean整数除法? (显而易见的解决方案是检查股息的标志)

有效地将无符号值除以2的幂,四舍五入

我想用2的任意幂实现无符号整数除法 ,有效地向上舍入 。 所以我想要的是数学上的ceiling(p/q) 0 。 在C中,不利用q的受限域的strawman实现可能类似于以下函数1 : /** q must be a power of 2, although this version works for any q */ uint64_t divide(uint64_t p, uint64_t q) { uint64_t res = p / q; return p % q == 0 ? res : res + 1; } …当然,我实际上并不想在机器级别使用除法或mod,因为即使在现代硬件上也需要很多周期。 我正在寻找使用轮class和/或其他一些廉价操作的力量减少 – 利用q是2的幂的事实。 你可以假设我们有一个有效的lg(unsigned int […]

C整数除法和楼层

在C中,整数除法a / b和floor(a / b)之间是否有区别,其中a和b都是整数? 更具体地说,在两个过程中发生了什

对浮点数和双精度快速乘法/除2(C / C ++)

在我正在编写的软件中,我正在进行数百万次乘法或除以2(或2的幂)的值。 我真的希望这些值为int以便我可以访问bitshift运算符 int a = 1; int b = a<<24 但是,我不能,而且我必须坚持双打。 我的问题是: 由于存在双精度(符号,指数,尾数)的标准表示,有没有办法使用指数来获得2的幂的快速乘法/除法 ? 我甚至可以假设位数将被修复(该软件将在总是具有64位长的双倍的机器上工作) PS:是的,该算法主要只执行这些操作。 这是瓶颈(它已经是multithreading的)。 编辑:或者我完全错了,聪明的编译器已经为我优化了一些东西? 临时结果(用Qt测量时间,矫枉过正,但我​​不在乎): #include #include #include #include #include using namespace std; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); while(true) { QElapsedTimer timer; timer.start(); int n=100000000; volatile double d=12.4; volatile double D; for(unsigned int i=0; i<n; ++i) { […]