精华内容
下载资源
问答
  • C语言编写简单的求解对数函数
    千次阅读
    2019-04-11 16:40:41

    用C语言编写简单的对数函数

    作为一个图像处理芯片公司的工程师,支持不同sensor的曝光策略是一个ISP的基本功能,但是有的sensor曝光策略复杂,还需要加上sensor厂商自己添加的补丁,而ISP本身空间有限,不能引用math.h,或者大量定义数组来查表,所以有时候需要发挥自己的想象力。

    比如`.

    // An highlighted block
    const unsigned int gain_table[225] = {
    	1024, 1046, 1069, 1092, 1116, 1140, 1166, 1191, 1217, 1244, 1271, 1299, 1328, 1356, 1386, 1416, 
    	1448, 1479, 1512, 1545, 1579, 1613, 1649, 1685, 1722, 1760, 1798, 1837, 1878, 1918, 1960, 2003, 
    	2048, 2092, 2138, 2185, 2233, 2281, 2332, 2383, 2435, 2489, 2543, 2598, 2656, 2714, 2774, 2833, 
    	2896, 2959, 3024, 3090, 3158, 3226, 3297, 3371, 3443, 3518, 3597, 3675, 3754, 3837, 3923, 4009, 
    	4096, 4185, 4277, 4371, 4466, 4563, 4664, 4766, 4871, 4976, 5087, 5197, 5312, 5427, 5546, 5667, 
    	5793, 5919, 6048, 6181, 6316, 6455, 6597, 6740, 6890, 7040, 7194, 7351, 7513, 7674, 7843, 8015, 
    	8192, 8371, 8555, 8742, 8933, 9127, 9331, 9532, 9742, 9956, 10174, 10394, 10625, 10859, 11096, 11335, 
    	11586, 11839, 12096, 12363, 12633, 12905, 13189, 13486, 13774, 14074, 14388, 14703, 15019, 15349, 15694, 
    	16039, 16384, 16743, 17102, 17476, 17867, 18255, 18662, 19065, 19485, 19901, 20336, 20789, 21236, 21704, 
    	22192, 22671, 23172, 23663, 24209, 24708, 25266, 25811, 26379, 26973, 27548, 28149, 28777, 29382, 30066, 
    	30727, 31359, 32078, 32768, 33487, 34239, 34952, 35696, 36792, 37282, 38130, 38926, 39850, 40721, 41630, 
    	42473, 43464, 44384, 45343, 46345, 47393, 48349, 49490, 50533, 51622, 52758, 53946, 55188, 56299, 57456, 
    	58867, 60133, 61455, 62836, 64035, 65536, 66841, 68478, 69905, 71392, 72944, 74565, 76260, 78033, 79512, 
    	81442, 83055, 85163, 86928, 88768, 90687, 92691, 94786, 96978, 98689, 101067, 103563, 105517, 107546, 
    	110376, 112598, 114912, 117323, 119837, 122461, 125203, 128070, 131072, 
    };
    void set_gain(unsigned int gain)
    {
        unsigned int ret = 0, i;
        unsigned int gain_idx, sghd_patch = 1;	
    	
    	// Check gain
        if (gain > gain_table[224])
            gain = gain_table[224];
        else if(gain < gain_table[0])
            gain = gain_table[0];
    
        // search most suitable gain into gain table
        for (i=0; i<224; i++) {
            if (gain_table[i]> gain)
                break;
        sensor_i2c_write(0x83, i);
    }
    

    这个sensor的增益策略是一个典型的查表法。但是ISP的空间有限,无法设定那么多数组,于是我在excel表中将数据做了处理,先搞清楚数组和所求的i之间的关系。

    发现对应表格数据除以32的平方增益倍数就比较容易看出来了。

    在这里插入图片描述

    大概的增益倍数 i = 32 x log2gain。
    所以想要知道i,必须要计算一个对数函数,但是问题来了,ISP的固件里面不能引用math.h!所以只能自己编写一个求对数的函数!通过百度,在csdn上查出来一个自己编写的对数函数:

    #include<stdio.h>
     
     
    double MYLOG(double a)
    {
       int N = 15;//我们取了前15+1项来估算
       int k,nk;
       double x,xx,y;
       x = (a-1)/(a+1);
       xx = x*x;
       nk = 2*N+1;
       y = 1.0/nk;
       for(k=N;k>0;k--)
       {
         nk = nk - 2;
         y = 1.0/nk+xx*y;
         
       }
       return 2.0*x*y;
       
    }
     
    int main()
    {
        double b ;
        b = MYLOG(2);
        
        printf("%.10f",b);
        getch();
        return 0;
    }
    

    作者:starINsky_mike
    来源:CSDN
    原文:https://blog.csdn.net/mike190267481/article/details/7404702
    版权声明:本文为博主原创文章,转载请附上博文链接!

    现在vs上模拟验证了一下,当N大于30的时候,得出来的i精度相差不大,我以为看到了希望,导入服务器,编译,但是问题又来了!!!固件没有空间承载大量计算!!
    所以只能自己想办法编写一个简单的对数函数!!!

    unsigned short Math(unsigned gain)
    {
        int i = 0,j = 0;
    	while (gain > 3)
    	{
    		gain = gain >> 1;
    		i++;
    	}
    	j =  (i +1) + ((3 * (s_nCurGain - (2<<i))) / s_nCurGain);
    	return j;
    }
    

    因为以2为底,所以先求出当前增益倍数为2的指数,然后将计算时省掉的低位部分算出来,当作简单的一次函数处理,来弥补之前只算指数的精度,通过vs模拟,精度差距竟然和百度到的差不多!!!哈哈哈哈哈!
    第一篇博客,写的有些简单,希望能对大家有所帮助!

    更多相关内容
  • C语言log()函数:返回以e为底的对数值 头文件: #include <math.h> log() 函数返回以 e 为底的对数值,其原型为: double log (double x); log()用来计算以e为底的 x 的对数值,然后将结果返回。设...
  • c语言对数函数log的使用

    万次阅读 多人点赞 2018-04-08 13:49:21
    c语言log函数使用:   #include&lt;... //以e为底的对数函数 printf("%f\n",log10(100)); //以10为底的对数函数 printf("%f\n",log(8)/log(2)); //计算log2^8,运...

    c语言log函数使用:

     

    #include<stdio.h>
    #include<math.h>
    int main(){ 
    	printf("%f\n",log(10)); //以e为底的对数函数 
    	printf("%f\n",log10(100)); //以10为底的对数函数 
    	printf("%f\n",log(8)/log(2)); //计算log2^8,运用换底公式 
    	printf("%f\n",exp(1)); //计算自然常数e
    	return 0;
    }

    输出结果如下:

     

    展开全文
  • 满意答案yj10377推荐于 2017.11.24采纳率:51%等级:12已帮助:10275人没有问题,输出m=0.301030;...2、log()和log10()函数均是double型,double转成float会有截断误差,将float r=0.01,m,n,g;中的fl...

    满意答案

    02ae427d08e371d7e90d5b995e828d6d.png

    yj10377

    推荐于 2017.11.24

    02ae427d08e371d7e90d5b995e828d6d.png

    采纳率:51%    等级:12

    已帮助:10275人

    没有问题,输出m=0.301030;n=0.004321;g=69.66

    编译时会提示warning,主要原因有

    1、int d=300000 过大,用长整形;

    2、log()和log10()函数均是double型,double转成float会有截断误差,将float r=0.01,m,n,g;

    中的float改成double就不会有warning了;

    3、getch()函数未声明,头文件加入#include,就不会有warning了。

    但warning不会影响运行结果。

    c 里直接提供的是 以 e 为底的自然对数 log ,和 以 10 为底的常用对数 log10

    其他对数写个函数就可以

    #include

    #include

    double loga(double n, double base);

    int main (void)

    {

    double a, b, c;

    a = log(exp(1));

    b = log10(10);

    c = loga(100, 5);

    printf("%lf %lf %lf", a, b, c);

    }

    double loga(double n, double base)

    { return log(n) / log(base);}

    51分享举报

    展开全文
  • C语言编写自己的对数函数

    千次阅读 2018-01-04 17:40:04
    今天学长突然问了我一个很有趣的问题,应该是他在仿真中需要考虑对数函数到底进行的复杂度是多大,所以要分析求一个数的对数到底需要多少次加法及乘法。这个问题一下就吸引了我,一般在C语言中我们就#include然后就...

    今天学长突然问了我一个很有趣的问题,应该是他在仿真中需要考虑对数函数到底进行的复杂度是多大,所以要分析求一个数的对数到底需要多少次加法及乘法。这个问题一下就吸引了我,一般在C语言中我们就#include<math.h>然后就直接用log(double x)函数来求ln(x)了,同样在Python中,一个import math,也可以直接用log函数了。但是从来没考虑过这些函数是怎么编写的,这其中自然要用到数值计算方面的技巧了,自己又不是计算机系的,当然对这些都没有涉猎,所以就只要靠无所不能的Google了。最后看了一本叫《实用数值计算方法》由清华大学出版社出版的书,里面有一章专门研究各个常用函数的C语言实现。为了自己以后方便,自己用Latex重新整理了下。

    具体代码如下:

    [cpp]  view plain  copy
    1. #include<stdio.h>  
    2.   
    3.   
    4. double MYLOG(double a)  
    5. {  
    6.    int N = 15;//我们取了前15+1项来估算  
    7.    int k,nk;  
    8.    double x,xx,y;  
    9.    x = (a-1)/(a+1);  
    10.    xx = x*x;  
    11.    nk = 2*N+1;  
    12.    y = 1.0/nk;  
    13.    for(k=N;k>0;k--)  
    14.    {  
    15.      nk = nk - 2;  
    16.      y = 1.0/nk+xx*y;  
    17.        
    18.    }  
    19.    return 2.0*x*y;  
    20.      
    21. }  
    22.   
    23. int main()  
    24. {  
    25.     double b ;  
    26.     b = MYLOG(2);  
    27.       
    28.     printf("%.10f",b);  
    29.     getch();  
    30.     return 0;  
    31. }  

    最后我们看看结果:


    后记:在广大计算机专业同学面前献丑了,自己纯粹是对于这个问题的好奇才去看了下,当然对sqrt()函数貌似原来知道用牛顿迭代来数值计算,这些都是兴趣使然,自己也不是太懂。另外,Latex许久不用,基本忘完了!

     

    参考文献:《实用数值计算方法》甄西丰编著,清华大学出版社。


    转载自:http://blog.csdn.net/mike190267481/article/details/7404702

    展开全文
  • 对数

    2021-03-18 12:23:30
    C语言对数 C语言关于对数仅提供两种方法: y=log(double x)表示数学中的 ln(x) y=log10(double x)表示数学中的 lg(x) y=log a(b)要进行变换log(b)/log(a)
  • 这篇文章主要介绍了在C语言中使用对数函数的方法,包括以e为底和以10为底的对数计算,需要的朋友可以参考下。C语言log()函数:返回以e为底的对数值头文件:#include log() 函数返回以 e 为底的对数值,其原型为:...
  • C语言对数函数log

    千次阅读 2012-10-23 10:14:00
     功 能: 对数函数log  用 法: double log10(double x);  程序例:  #include  #include  int main(void)  {  double result;  double x = 8
  • C语言log()函数:返回以e为底的对数值头文件:#includelog() 函数返回以 e 为底的对数值,其原型为:double log (double x);log()用来计算以e为底的 x 的对数值,然后将结果返回。设返回值为 ret,则x = eret如果 x ...
  • #define e 2.71828 //使用define函数给e定义初值 main() { int x; printf("请你输入x的值\n"); scanf("%d",&amp;x); if(0&lt;=x&amp;&amp;x&lt;20) printf("y=%d
  • 就像是楼上写的 通常随机函数rand() 带有时间种子的随机函数srand(time(0))在用rand()...但如果对数有要求,如小数或在一定值以内:小数:.srand()函数C语言中产生随机数的一个函数函数原型: void srand(unsign...
  • c语言里面log函数怎么用

    万次阅读 多人点赞 2016-11-29 19:51:28
    功 能: 对数函数log,以10为底 用 法: double log10(double x); 程序示例: #include #include int main(void) { double result; double x = 800.6872; result = log10(x); printf("The common log of
  • #include #include //初始化数组 void init(int arr[], int length) { int i = 0;... //函数的调用 init(arr, length); reverse(arr, length); printf("\n"); empty(arr, length); system("pause"); return 0; }
  • 首先要知道声明基本变量该如何声明: 对于声明一个基本变量:即int num; 对于声明多个变量:可以分开声明(但一般不这样做),用的更多的是放在一起声明,即:int num , art , edge; 这里最容易犯错误的是对多个...
  • C语言——快速取以2为底x的对数

    千次阅读 2020-05-08 15:07:37
    1. 自己的函数 int FastLog2(int x) { float fx; unsigned long ix, exp; fx = (float)x; ix = *(unsigned long*)&fx; exp = (ix >> 23) & 0xFF; return exp - 127; } ...
  • C语言常用函数用法大全

    千次阅读 2021-05-18 15:17:46
    C语言是当中广泛的计算机编程语言,是所有计算机编程语言的祖先,其他计算机编程语言包括当前流行的Java语言,都是用C语言实现的,C语言是编程效率高的计算机语言,既能完成上层应用开发,也能完成底层硬件驱动编程...
  • C语言pow()函数:求x的y次方(次幂) 头文件: #include <math.h> pow() 函数用来求 x 的 y 次幂(次方),其原型为: double pow(double x, double y); pow()用来计算以x 为底的 y 次方值,然后将结果...
  • C语言对数组进行排序

    2021-10-15 17:13:21
    C语言对数组进行排序 对数组进行排序的方法有很多,我选择使用最基础的选择排序,在创建一个数组用于存放数据的时候,我们并不知道需要进行排序的数据个数有多少,如果固定数组的长度,就会使得程序变得不够方便,若...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,581
精华内容 9,832
关键字:

c语言对数函数

友情链接: PRIOITY.zip