-
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语言中使用对数函数的方法
2020-12-31 00:49:53C语言log()函数:返回以e为底的对数值 头文件: #include <math.h> log() 函数返回以 e 为底的对数值,其原型为: double log (double x); log()用来计算以e为底的 x 的对数值,然后将结果返回。设... -
c语言对数函数log的使用
2018-04-08 13:49:21c语言log函数使用: #include<... //以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; }
输出结果如下:
-
c语言中对数函数的表示。。。
2021-05-21 04:50:43满意答案yj10377推荐于 2017.11.24采纳率:51%等级:12已帮助:10275人没有问题,输出m=0.301030;...2、log()和log10()函数均是double型,double转成float会有截断误差,将float r=0.01,m,n,g;中的fl...满意答案
yj10377
推荐于 2017.11.24
采纳率: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重新整理了下。
具体代码如下:
最后我们看看结果:
后记:在广大计算机专业同学面前献丑了,自己纯粹是对于这个问题的好奇才去看了下,当然对sqrt()函数貌似原来知道用牛顿迭代来数值计算,这些都是兴趣使然,自己也不是太懂。另外,Latex许久不用,基本忘完了!
参考文献:《实用数值计算方法》甄西丰编著,清华大学出版社。
转载自:http://blog.csdn.net/mike190267481/article/details/7404702
-
对数
2021-03-18 12:23:30C语言求对数 C语言关于对数仅提供两种方法: y=log(double x)表示数学中的 ln(x) y=log10(double x)表示数学中的 lg(x) y=log a(b)要进行变换log(b)/log(a) -
【用法】在C语言中使用对数函数的方法
2021-05-20 15:54:08这篇文章主要介绍了在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函数,在C语言中使用对数函数的方法
2021-05-22 02:24:04C语言log()函数:返回以e为底的对数值头文件:#includelog() 函数返回以 e 为底的对数值,其原型为:double log (double x);log()用来计算以e为底的 x 的对数值,然后将结果返回。设返回值为 ret,则x = eret如果 x ... -
C语言分段函数计算(三角,对数函数使用方法)
2019-03-11 17:20:50#define e 2.71828 //使用define函数给e定义初值 main() { int x; printf("请你输入x的值\n"); scanf("%d",&x); if(0<=x&&x<20) printf("y=%d -
C语言随机函数(c语言随机函数rand怎么用)
2021-05-23 12:13:31就像是楼上写的 通常随机函数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 -
C语言对数组的各种操作操作
2021-05-22 15:02:32#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; } -
C语言中函数的声明与数组的声明
2021-11-15 21:04:42首先要知道声明基本变量该如何声明: 对于声明一个基本变量:即int num; 对于声明多个变量:可以分开声明(但一般不这样做),用的更多的是放在一起声明,即:int num , art , edge; 这里最容易犯错误的是对多个... -
C语言——快速取以2为底x的对数
2020-05-08 15:07:371. 自己的函数 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:46C语言是当中广泛的计算机编程语言,是所有计算机编程语言的祖先,其他计算机编程语言包括当前流行的Java语言,都是用C语言实现的,C语言是编程效率高的计算机语言,既能完成上层应用开发,也能完成底层硬件驱动编程... -
用C语言求幂函数和指数函数的方法
2020-12-31 04:40:35C语言pow()函数:求x的y次方(次幂) 头文件: #include <math.h> pow() 函数用来求 x 的 y 次幂(次方),其原型为: double pow(double x, double y); pow()用来计算以x 为底的 y 次方值,然后将结果... -
C语言对数组进行排序
2021-10-15 17:13:21C语言对数组进行排序 对数组进行排序的方法有很多,我选择使用最基础的选择排序,在创建一个数组用于存放数据的时候,我们并不知道需要进行排序的数据个数有多少,如果固定数组的长度,就会使得程序变得不够方便,若...