cmath

文章目录

  • 计算机是如何实现tanh计算的
  • 一、tanh的一些基本内容
  • 二、代码
    • 1.我的实现例子
    • 2.代码中分段函数的实现原理
  • 补充

计算机是如何实现tanh计算的


一、tanh的一些基本内容

对于tanh函数有公式为 tanh(x)=(ex−e−x)/(ex+e−x)tanh(x) = (e^{x} -e^{-x}) / (e^{x}+e^{-x})tanh(x)=(ex−e−x)/(ex+e−x)。其定义域为R,原因是分母利用不等式可得>=2,所以无限制条件。

其次需要知道tanh的泰勒展开式,为tanh(x)=∑n=1∞22n(2n−1)B2nx2n−1(2n!)tanh(x) = \sum_{n=1}^{\infty} \frac {2^{2n} (2n-1)B_{2n}x^{2n-1}}{(2n!)} tanh(x)=n=1∑∞​(2n!)22n(2n−1)B2n​x2n−1​
其中B2nB_{2n}B2n​是伯努利数。
其函数图像如下:
一目了然,奇函数有$-tanh(x) = tanh(-x) $。因此我们只需要在正区间内讨论其值即可。

另外需要清楚这个导数公式,也可以证出其单调性,以及曲线趋于平直的点[tanh(x)]′=1−tanh2(x)[{tanh(x)}]' = 1-tanh^{2}(x)[tanh(x)]′=1−tanh2(x)

二、代码

1.我的实现例子

代码如下(示例):

#include <bits/stdc++.h>using namespace std;float myexp(float x){return 1+x+x*x/2+x*x*x/6+x*x*x*x/24+x*x*x*x*x*x/120;
}float mytanh(float x){int ix = (*(int*)&x) & 0x7fffffff;  //去掉符号位 float t; //中间变量float z;  //最终结果if(ix >= 0x7f800000){if(x >= 0) return 1; //+Inf else return 1/x - 1;    //-Inf or NaN}if(ix < 0x41B00000){ //|x| < 22if(ix < 0x24000000){   //|x| < -55return x*(1+x);}if(ix >= 0x40000000){ //|x| >= 1t = myexp(2*ix)-1;z = 1 - 2/(t+2);}else{t = myexp(-2*ix)-1;z = -t/(t+2);}}else{return z = 1;   // |x| > 22  return +-1}return (x >= 0)? z : -z;
}int main(){float i = 5.123456;float m = mytanh(i);float n = tanh(i);float q = m - n;cout << "mytanh = " << m << "cmath's tanh " << n << endl;cout << q;return 0;}

2.代码中分段函数的实现原理

1、在0<=x<=2−550 <= x <= 2^{-55}0<=x<=2−55时,有tanh(x)=x∗(1+x)tanh(x) = x*(1+x)tanh(x)=x∗(1+x)
2、在2−55<x<=12^{-55} < x <=12−55<x<=1时, 有tanh(x)=−tt+2tanh(x) = \frac{-t}{t+2}tanh(x)=t+2−t​ 其中t=e−2x−1t = e^{-2x}-1t=e−2x−1
3、在1<=x<221 <= x < 221<=x<22时,有tanh(x)=1−2t+2tanh(x) = 1 - \frac{2}{t+2}tanh(x)=1−t+22​ 其中t=e2x−1t = e^{2x}-1t=e2x−1
4、在22<x<inf22 < x < inf22<x<inf时,有tanh(x)=1tanh(x) = 1tanh(x)=1

下面对这四段函数进行具体解释:
对于第一段,是因为在x趋于一个很小的数值时近似有Tanh(x) = x,此时(1+x)约等于1,对于公式中逼近0的一段区间分子使用泰勒即为2x+2x22x+2x^{2}2x+2x2,分母就是2,所以可以直接得到x(1+x)这个式子。但是为什么是2−552^{-55}2−55这个值,还有待研究,但是确定的是这里使用一个较小的值即可

对于第二和第三段,对tanh(x)的公式进行通分化简即可得出结果,无误差。

对于第四段,便可以使用我们前边提到过的导数,令导数为0,也即求tanh(x)=1tanh(x) = 1tanh(x)=1的x的值,在计算器中我们可以得到tanh(17) 约等于 0.9999999999999964。tanh(18)约等于1,因此找到了一个点,但是在glibc中其使用了22作为这个点,大于这个点的x代入tanh(x)中均会得到结果1。


补充

代码中使用了位运算的技巧,需要清楚ieee754浮点数标准后进行阅读。这篇只是对tanh标量的初步认知,后面重点是进行向量化计算。

【Tanh的标量实现】相关推荐

  1. 【Python--torch(激活函数说明+代码讲解)】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh)

    [Python–torch]激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh) 文章目录 [Python--torch]激活函数(sigmoid/softmax ...

  2. 常用激活函数:Sigmoid/Softmax/ELU/ReLU/LeakyReLU/Tanh...(Pytorch)

    激活函数 一.Sigmoid 1.介绍 2.实例 二.Softmax 1.介绍 2.实例 三.ELU:指数线性单元函数 1.介绍 2.实例 四.ReLU:整流线性单元函数 1.介绍 2.实例 五.Re ...

  3. scratch lenet(9): C语言实现tanh的计算

    文章目录 1. 目的 2. tanh ⁡ ( x ) \tanh(x) tanh(x) 的 naive 实现 2.1 数学公式 2.2 naive 实现 3. tanh ⁡ ( x ) \tanh(x ...

  4. 机器学习入门(03)— 激活函数分类(阶跃函数和 sigmoid 函数的理论、实现、显示以及区别、非线性函数、ReLU 函数、tanh 函数)

    各种激活函数介绍,请参考下面链接: https://en.wikipedia.org/wiki/Activation_function 1. 阶跃函数 1.1 理论 式(3.3)表示的激活函数以阈值为 ...

  5. Python的标量与矢量运算分析

    文章目录 技术背景 NumPy Pytorch TensorFlow Numba Cython 标量运算 矢量运算 经验总结 技术背景 Python 的官方解释器是用 C 实现的 CPython .其 ...

  6. 常用的激活函数(Sigmoid、Tanh、ReLU等)

    目录 一.激活函数定义 二.梯度消失与梯度爆炸 1.什么是梯度消失与梯度爆炸 2.梯度消失的根本原因 3.如何解决梯度消失与梯度爆炸问题 三.常用激活函数 1.Sigmoid 2.Tanh 3.ReL ...

  7. 深度学习常用的激活函数以及python实现(Sigmoid、Tanh、ReLU、Softmax、Leaky ReLU、ELU、PReLU、Swish、Squareplus)

    2022.05.26更新 增加SMU激活函数 前言 激活函数是一种添加到人工神经网络中的函数,类似于人类大脑中基于神经元的模型,激活函数最终决定了要发射给下一个神经元的内容. 此图来自百度百科,其中s ...

  8. NumPy — 创建全零、全1、空、arange 数组,array 对象类型,astype 转换数据类型,数组和标量以及数组之间的运算,NumPy 数组共享内存

    NumPy 简介 一个用 python 实现的科学计算包.包括: 1.一个强大的 N 维数组对象 Array : 2.比较成熟的(广播)函数库: 3.用于整合 C/C++ 和 Fortran 代码的工 ...

  9. 机器学习中的标量、向量、矩阵、和张量的概念

    在线性代数中,我们必须掌握几个核心概念:标量.向量.矩阵和张量,它们是构成线性代数学科的基石. 标量 (Scalar) 标量其实就是一个独立存在的数,比如在线性代数中一个实数 5 就可以被看作一个标量 ...

最新文章

  1. 联想重启乐檬?5G时代手机双品牌战略带来变局
  2. (0065)iOS开发之工具条UIToolBar
  3. CocosEditor 1.0Final-IDEA13.0和1.5-IDEA13.1 发布–2014.03.25
  4. 10道C++输出易错笔试题收集
  5. 基类的构造函数也可以被继承_「C++ Primer plus 心得」13.类继承
  6. mongoose日期 时间 范围查询
  7. ARKit:增强现实技术在美团到餐业务的实践
  8. 2019日历全年一张_python 日历模块calendar
  9. bond解除 centos7_centos7上实现bonding
  10. Perl opendir()函数
  11. Python为视频设置遮罩实现异形窗口播放
  12. 静态检查------SourceMonitor的学习和使用
  13. android中横向滑动功能,Android开发基于ViewPager+GridView实现仿大众点评横向滑动功能...
  14. easyui 获取cloumns字段
  15. 记录一个小程序 input输入框格式手机号方法
  16. 跨省市跳槽,社保公积金处理办法
  17. 什么是EMC?什么是EMI?什么是EMS?电磁兼容详解(一)
  18. 银广夏事件--中国股票财务作假事件
  19. 微信小程序支付V3(Java版)
  20. java毕业设计搬家预约系统Mybatis+系统+数据库+调试部署

热门文章

  1. 绝地求生,PUBG卡在初始界面无法进入怎么办
  2. 解决CSV文件打开乱码的问题
  3. 动捕设备平民化 创作者怎么选?
  4. 文字界面与图形化界面
  5. [JVM] 如何查看当前使用的JVM参数
  6. JAVA基础--String类
  7. 全国对讲-物联卡的介绍
  8. Redis持久化存储(详细)
  9. 一、JAVA虚拟机------JVM自动内存管理
  10. java画空心金字塔