IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> C 自定义explogln函数源码记录 -> 正文阅读

[开发工具]C 自定义explogln函数源码记录

1.因为某些原因使用自定义的,没有自己写的代码都是拷贝的。

版本一:

exp:

static double my_log2(double x)
{

   register double ret;

   __asm__(

      "fld1;"

      "fxch;"

      "fyl2x"

      : "=t" (ret)

      : "0" (x)

   );

 

   return ret;
}

static double log2(double x)
{
	return my_log2(x);
}

static double my_pow(double x, double y)

{

   register double ret, value;

   double r = 1.0;

   long p = (long) y;

 

   if (x == 0.0 && y > 0.0)

      return 0.0;

   if (y == (double) p)

   {

     

      if (p == 0)

        return 1.0;

      if (p < 0)

      {

        p = -p;

        x = 1.0 / x;

      }

      while (1)

      {

        if (p & 1)

           r *= x;

        p >>= 1;

        if (p == 0)

           return r;

        x *= x;

      }

   }

   __asm__(

      "fmul  %%st(1);"

      "fst   %%st(1);"

      "frndint;;"

      "fxch;;"

      "fsub %%st(1);;"

      "f2xm1;;"

      : "=t" (ret), "=u" (value)

      :  "0" (log2 (x)), "1" (y)

   );

   ret += 1.0;

   __asm__(

      "fscale"

      : "=t" (ret)

      : "0" (ret), "u" (value)

   );

   return ret;

}



static double exp(double x)
{
	return my_pow(2.718281828459,x);
}

log:

static double my_log10(double x)
{

   register double ret;

   __asm__(

      "fldlg2;"

      "fxch;"

      "fyl2x"

      : "=t" (ret)

      : "0" (x)

   );

   return ret;

}
static double log10(double x)  
{  
    return my_log10(x);  
} 

ln:

static double my_log(double x)

{

   register double ret;

   __asm__(

      "fldln2;"

      "fxch;"

      "fyl2x"

      : "=t" (ret)

      : "0" (x)

   );

   return ret;
}

static double ln(double x)  
{  
    return my_log(x);  
} 

由于是直接使用的嵌入汇编,在64位程序无法正确使用。然后就抄写了另外一种:

版本二:

使用泰勒公式进行计算(我哪里还记得当年学的这个啊!)。

static double exp(double x)
{
	double term, ex;
	unsigned long n;
	int sign;

	if (x == 0)
	{
		return (double)1;
	}

	if (x < 0)
	{
		sign = 0;
		x = -x;
	}
	else
	{
		sign = 1;
	}

	n = 1;
	ex = x + 1;
	term = x;

	do {
		n += 1;
		term /= n;
		term *= x;
		ex += term;

		if (ex > 1E16)
		{
			if (sign)
			{
				return (1E17);
			}
			else
			{
				return 0;
			}
		}
	} while (term > 1E-15);

	if (sign)
	{
		return ex;
	}
	else
	{
		return 1 / ex;
	}
}


static double log(double x)
{
	double y, y2, r, num, lr, r1, x2;
	unsigned long den;
	int i, n, j;
	
	if (x <= 0) //无效的参数
	{
		return 0;
	}
	
	if (x == 1)
	{
		return 0;
	}

	j = 0;
	while (x < 1)
	{
		x *= 10;
		j++;
	}

	if (x > 1 && x < 2)
	{
		y = (x - 1) / (x + 1);
		y2 = y * y;

		r = 0;
		num = y;
		den = 1;

		do {
			lr = r;
			r += num / den;
			num *= y2;
			den += 2;
		} while (lr != r);

		return (r * 2 - j * LN10);
	}
	else
	{
		i = 0;
		n = 1;
		den = 2;

		while (x > 2)
		{
			x /= 2;
			i++;
		}

		x = (x - 1) / (x + 1);
		x2 = x * x;
		r1 = 2 * x;
		r = 0;

		while (r1 > 1E-15)
		{
			r += r1;
			n += den;
			x *= x2;
			r1 = 2 * x / n;
		}

		return (r + LN2 * i - j * LN10);
	}
}

static double log10(double x)
{
	return log(x) / log(10);
}

都是使用比较简单的加减乘除,目前就这样。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:50:46  更:2022-02-26 11:52:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:41:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码