手搓指数函数实现

1.概况

最近博主有使用指数函数的需求,需要一条在第一象限、底数为10的曲线。但是由于芯片资源有限,所以无法使用数学库。不能调用数学库里面的指数函数。于是就在网上找了一圈,发现毫无质量。
1.只考虑到了整数次幂的简单情况。

2.要么就是调用数学库,没有一个有用的。

于是打算自己手搓一个指数函数。

2.算法

首先要想实现指数函数,我们需要知道怎么去计算指数函数。简单的比如 101 = 10

102 = 10 * 10 =100

103 = 10* 10 * 10 = 1000
倘若我拿出小数次幂,阁下又该如何应对。
比如:10^0.001的值是多少?

100.001 = ?

elna = a

100.001 = eln2 0.001

泰勒展开公式:ex =
ex=1+x\frac1!+x2/2!+x3/3!+⋯,-∞<x<∞

3.代码实现示例

float pow(float x, int y) 
{
    if (y == 0)return 1;
    float result = 1.0;
    int i;
    for (i = 0; i < y; i++) {
        result *= x;
    }
    return result;
}

int factorial(int y) {
    if (y == 0)return 1;
    float result = 1.0;
    int i;
    for (i = 1; i <= y; i++) {
        result *= i;
    }
    return result;
}

float my_pow10(float z)
{
   int intPart = (int)z;
   float fractionalPart = z - intPart;
   float intResult = 1;
   float ln10_value = 2.302585;
   float fff;
   fff = ln10_value *fractionalPart;
   intResult+= fff;
   for (int i=2;i<=12;i++)
   { 
       intResult+= pow(fff,i)/jie(i);
   }
   return intResult*pow(10,intPart);
}

3.1.代码解析

此代码示例只是博主为了实现自己需求求以10为底的在第一象限的指数曲线,仅供参考,大家若有其他指数需求可模仿开发

3.1.1计算原理

参数从my_pow10中输入(0~无穷),
根据指数法则:10a * 10b = 10(a+b)将传入的参数分为整数部分和小数部分。小数部分值用函数factorial计算泰勒展开值。整数部分用函数pow计算。最终将两部分值相乘输出。

3.1.2计算精度控制

代码中精度控制为代码中的循环次数,若循环次数更多则结果更逼近最终结果,博主这里精度算到12以满足,如需要更高精度,修改这里的循环次数即可。

for (int i=2;i<=12;i++)
{ 
    intResult+= power1(fff,i)/jie(i);
}

4.总结

本文博主示范了以10为底的指数函数实现,若实现其他为底的,可以模仿这个实现。能实现小数次幂的指数计算,可以说泰勒展开真的是功不可没。很难想象在还没有泰勒展开以前人们对求小数次幂毫无办法。膜拜这些伟大的数学家。

posted @ 2025-02-06 10:54  tonyangstark  阅读(87)  评论(0)    收藏  举报