开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2773|回复: 31
收起左侧

[易语言纯源码] 首发,数学之美,泰勒级数的应用,大数支持库的扩展

[复制链接]

结帖率:100% (47/47)
发表于 2023-7-10 22:54:09 | 显示全部楼层 |阅读模式   广东省惠州市
分享源码
界面截图: -
是否带模块: -
备注说明: -
本帖最后由 明天自然醒 于 2023-7-11 20:39 编辑

你会发现你在论坛上,支持库里都找不到支持

  • ln(自然对数)/ lg(以10位底的对数函数)
  • exp(以自然对数为底的指数函数)
  • pow(求次方)


以上这几个数学基本函数,可能由于精度和运算速度的问题,我猜测作者没有开发。


所以,本帖旨在缩小精度,速度不保证的情况下,提出上述三个函数。采用的是泰勒级数展开法,可能收敛比较慢,取得是小数部分的或参数优化,所以精度稍微有保障(统一了次数)

QQ截图20230710224541.png

*意思是存在一定的误差,工程上允许的误差!

在关于lnx的函数原理中,我构造了两种函数,Remez函数是借鉴了C语言的核心,反反复复折腾了好久,有能力的可以参考原作品,或者参考Windows计算器的开源版,在GitHub上有发布。


标准方案,这套方案是 1993 年由 Sun Microsystems 正式写入 C 标准库的方案,函数为 double ieee754log(double x)(ieee754: IEEE二进制浮点数算术标准)。但这套方法为了性能的苛刻而写得过于复杂.


所有的对数函数计算核心都是利用(泰勒级数)然后多项式求和计算结果。为了性能或者精度的要求可能会对展开后的求和式子做进一步优化,最终会封装一个 ln 函数出来。其余的对数函数都是使用换底公式来套 ln 函数做的最底层实现,随着大量图形运算的需求提升,ln函数实现得好不好直接决定你电脑快不快。


[C] 纯文本查看 复制代码
#include "fdlibm.h"

#ifdef __STDC__
static const double
#else
static double
#endif
ln2_hi  =  6.93147180369123816490e-01,        /* 3fe62e42 fee00000 */
ln2_lo  =  1.90821492927058770002e-10,        /* 3dea39ef 35793c76 */
two54   =  1.80143985094819840000e+16,  /* 43500000 00000000 */
Lg1 = 6.666666666666735130e-01,  /* 3FE55555 55555593 */
Lg2 = 3.999999999940941908e-01,  /* 3FD99999 9997FA04 */
Lg3 = 2.857142874366239149e-01,  /* 3FD24924 94229359 */
Lg4 = 2.222219843214978396e-01,  /* 3FCC71C5 1D8E78AF */
Lg5 = 1.818357216161805012e-01,  /* 3FC74664 96CB03DE */
Lg6 = 1.531383769920937332e-01,  /* 3FC39A09 D078C69F */
Lg7 = 1.479819860511658591e-01;  /* 3FC2F112 DF3E5244 */

static double zero   =  0.0;

#ifdef __STDC__
        double __ieee754_log(double x)
#else
        double __ieee754_log(x)
        double x;
#endif
{
        double hfsq,f,s,z,R,w,t1,t2,dk;
        int k,hx,i,j;
        unsigned lx;

        hx = __HI(x);                /* high word of x */
        lx = __LO(x);                /* low  word of x */

        k=0;
        if (hx < 0x00100000) {                        /* x < 2**-1022  */
            if (((hx&0x7fffffff)|lx)==0) 
                return -two54/zero;                /* log(+-0)=-inf */
            if (hx<0) return (x-x)/zero;        /* log(-#) = NaN */
            k -= 54; x *= two54; /* subnormal number, scale up x */
            hx = __HI(x);                /* high word of x */
        } 
        if (hx >= 0x7ff00000) return x+x;
        k += (hx>>20)-1023;
        hx &= 0x000fffff;
        i = (hx+0x95f64)&0x100000;
        __HI(x) = hx|(i^0x3ff00000);        /* normalize x or x/2 */
        k += (i>>20);
        f = x-1.0;
        //  到这,第一步标记,得出 k, f, s 的值了
        if((0x000fffff&(2+hx))<3) {        /* |f| < 2**-20 */
            if(f==zero) if(k==0) return zero;  else {dk=(double)k;
                                 return dk*ln2_hi+dk*ln2_lo;}
            R = f*f*(0.5-0.33333333333333333*f);
            if(k==0) return f-R; else {dk=(double)k;
                         return dk*ln2_hi-((R-dk*ln2_lo)-f);}
        }
         s = f/(2.0+f); 
        dk = (double)k;
        z = s*s;
        i = hx-0x6147a;
        w = z*z;
        j = 0x6b851-hx;
        t1= w*(Lg2+w*(Lg4+w*Lg6)); 
        t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); 
        i |= j;
        R = t2+t1;
        if(i>0) {
            hfsq=0.5*f*f;
            if(k==0) return f-(hfsq-s*(hfsq+R)); else
                     return dk*ln2_hi-((hfsq-(s*(hfsq+R)+dk*ln2_lo))-f);
        } else {
            if(k==0) return f-s*(f-R); else
                     return dk*ln2_hi-((s*(f-R)-dk*ln2_lo)-f);
        }
}


主要核心应该是:雷米兹算法 - 维基百科,自由的百科全书 (wikipedia.org)https://zh.wikipedia.org/wiki/%E9%9B%B7%E7%B1%B3%E8%8C%B2%E6%BC%94%E7%AE%97%E6%B3%95
Remez算法。
QQ截图20230710224700.png
QQ截图20230710224708.png

  
输出结果 (类_大数运算.ln (制大数_ (“2131231231231231230.130192390123012312312321313123123”)))
' Remez 算法
输出结果 (类_大数运算.ln_Remez (制大数_ (“2131231231231231230.130192390123012312312321313123123”)))
输出结果 (类_大数运算.lg (制大数_ (“2131231231231231230.130192390123012312312321313123123”)))
输出结果 (类_大数运算.lg_Remez (制大数_ (“2131231231231231230.130192390123012312312321313123123”)))
输出结果 (类_大数运算.pow_Remez (制大数_ (“-0.001231092”), 制大数_ (“-0.00000000001231321231092”)))
输出结果 (类_大数运算.pow (制大数_ (“-0.001231092”), 制大数_ (“-0.00000000001231321231092”)))
输出结果 (类_大数运算.exp (制大数_ (“-0.101231231231231130192390123012312312321313123123”)))

  
' 自然对数
输出结果 (类_大数运算.ln (制大数_ (“2131231231231231230.130192390123012312312321313123123”)))
' 自然对数 的 Remez 算法
输出结果 (类_大数运算.ln_Remez (制大数_ (“2131231231231231230.130192390123012312312321313123123”)))
' 以10位底的对数函数
输出结果 (类_大数运算.lg (制大数_ (“2131231231231231230.130192390123012312312321313123123”)))
输出结果 (类_大数运算.lg_Remez (制大数_ (“2131231231231231230.130192390123012312312321313123123”)))
' 幂函数
输出结果 (类_大数运算.pow_Remez (制大数_ (“-0.001231092”), 制大数_ (“-0.00000000001231321231092”)))
输出结果 (类_大数运算.pow (制大数_ (“-0.001231092”), 制大数_ (“-0.00000000001231321231092”)))
' 指数函数
输出结果 (类_大数运算.exp (制大数_ (“-0.101231231231231130192390123012312312321313123123”)))

大数扩展函数.e (24.69 KB, 下载次数: 46)

评分

参与人数 4好评 +3 精币 +7 收起 理由
wa690602724 + 1 感谢分享,很给力!~
神女软件定制 + 1 + 3 不明觉厉
pyms + 1 + 2 YYDS~!
光影魔术 + 1 + 1 开源精神必须支持~

查看全部评分


本帖被以下淘专辑推荐:

结帖率:100% (4/4)

签到天数: 24 天

发表于 2024-1-16 08:33:20 | 显示全部楼层   山东省淄博市
感谢分享,学习了
回复 支持 反对

使用道具 举报

结帖率:67% (2/3)

签到天数: 2 天

发表于 2023-12-19 18:42:36 | 显示全部楼层   江苏省淮安市
加油加油
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2023-11-10 16:40:59 | 显示全部楼层   西藏自治区拉萨市
牛逼,开源万岁
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2023-11-10 16:35:54 | 显示全部楼层   西藏自治区拉萨市
最近在研究数据分析,感觉很有用
回复 支持 反对

使用道具 举报

发表于 2023-8-20 01:52:15 | 显示全部楼层   四川省德阳市
回复 支持 反对

使用道具 举报

发表于 2023-7-26 20:14:27 | 显示全部楼层   广东省广州市
感觉挺有用的!
回复 支持 反对

使用道具 举报

结帖率:100% (47/47)

签到天数: 26 天

 楼主| 发表于 2023-7-22 10:49:43 | 显示全部楼层   广东省惠州市
笨来无一悟 发表于 2023-7-16 12:44
求个 什么 框架排序器 的 传送门 没有搜到 想学习学习

https://bbs.125.la/forum.php?mod ... B%E6%8E%92%E5%BA%8F

点评

谢谢大佬 已下载 O(∩_∩)O   贵州省*  发表于 2023-7-22 10:57
回复 支持 反对

使用道具 举报

签到天数: 14 天

发表于 2023-7-17 21:14:31 | 显示全部楼层   江苏省连云港市

感谢分享 支持开源 !
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 11 天

发表于 2023-7-16 12:44:09 | 显示全部楼层   贵州省毕节市
求个 什么 框架排序器 的 传送门 没有搜到 想学习学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表