【C语言】程序性能优化——除法运算符

【C语言】程序性能优化——除法运算符


文章目录

    • @[TOC](文章目录)
  • 前言
  • 一、牛顿迭代法
    • 1、数学基础
    • 2、C代码
    • 3、实验
  • 二、二进制移位和减法来实现除法
    • 1、数学基础
    • 2、C代码
    • 3、实验
  • 三、参考资料
  • 总结

前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、牛顿迭代法

1、数学基础

在这里插入图片描述

2、C代码

#define MAX_ITER 1000
#define TOLERANCE 1e-10
 
double newton_divide(double a, double b)
{
    double f_x, f_prime_x;
		double x;
		double iter;
		double x_next;
    if (b == 0) 
		{
        printf("Error: Division by zero.\n");
        return -1; 
    }
    while (iter < MAX_ITER) 
		{
        f_x = x * b - a;
        f_prime_x = b;
		 x_next = x - f_x / f_prime_x;		
        // ??????
        if (fabs(x_next - x) < TOLERANCE) 
				{
            return x_next;
        }
        x = x_next;
        iter++;
    }
   return x;
}
	int a=10;
	int b=4;
	printf("newton_divide = %f\n",newton_divide(a, b));
	printf("div= %d\n",Div(a,b));

3、实验

在这里插入图片描述

二、二进制移位和减法来实现除法

1、数学基础

左移操作:在C语言中,m = m << 1 是将整数 m 左移一位,这相当于将 m 乘以2(在二进制中,左移一位就是在数的末尾添加一个0)。
倍增和减法:内层循环通过倍增 m(即 y 的倍数)来找到不超过 x/2 的最大倍数。这个步骤试图通过快速倍增来逼近 x,以便在每次外层循环迭代中尽可能多地减少 x 的值。
逐次逼近:外层循环不断重复这个过程,直到 x 小于 y。在每次迭代中,它都会从 x 中减去一个尽可能大的 y 的倍数(即 y*m),并将这个倍数累加到结果 result 中。

2、C代码

int Div(int x,int y)
{
	int result=0;
	if(y==0)return -1;
	while(x >=y)
	{
		int m=1;
		while(y*m <= (x>>1))
		{
			m=m<<1;
		}
		result+=m;
		x-=y*m;
	}
	return result;
}

3、实验

在这里插入图片描述

三、参考资料

除法的优化
c笔试面试 之 不用除法操作实现两个正整数的除法
C语言程序性能优化:十大策略及代码案例解析
给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数
fabs函数的使用
C语言面试题汇总(华为公司)

总结

本文仅仅简单介绍了【C语言】程序性能优化——除法运算符,评论区欢迎讨论。

上一篇:如何在Debian系统里使用Redhat(CentOS)的方式配置网络