htcleo: add log function

This commit is contained in:
Markinus 2010-08-28 13:39:07 +02:00
parent 77e39896ce
commit 4b3aa128b9
2 changed files with 122 additions and 0 deletions

View File

@ -101,6 +101,7 @@ obj-$(CONFIG_MACH_BRAVOC) += board-bravoc-microp.o clock.o
obj-$(CONFIG_MACH_HTCLEO) += board-htcleo.o board-htcleo-spi.o board-htcleo-panel.o board-htcleo-keypad.o
obj-$(CONFIG_MACH_HTCLEO) += board-htcleo-ts.o board-htcleo-mmc.o ieee754-df.o
obj-$(CONFIG_MACH_HTCLEO) += board-htcleo-log.o
obj-$(CONFIG_MACH_HTCLEO) += clock-wince.o
# MSM7x30 boards

View File

@ -0,0 +1,121 @@
/* arch/arm/mach-msm/board-htcleo-log.c
*
* Copyright (C) 2010 Cotulla
* Copyright (C) Open Watcom Project
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include <linux/module.h>
#include <linux/param.h>
#include <linux/jiffies.h>
#include <linux/workqueue.h>
#include <linux/kernel.h>
#define sqrt_of_half 0.7071067811865475244
#define C1 (355./512.)
#define C2 (-2.121944400546905827679e-4)
static const double APoly[] =
{
-0.78956112887491257267,
0.16383943563021534222e+2,
-0.64124943423745581147e+2
};
static const double BPoly[] =
{
1.0,
-0.35667977739034646171e+2,
0.31203222091924532844e+3,
-0.76949932108494879777e+3
};
static double _EvalPoly( double x, const double *poly, int degree )
/********************************************************************/
{
double z;
z = *poly++;
do
{
z = z * x + *poly++;
} while( --degree != 0 );
return( z );
}
static double frexp( double value, int *exp )
/**********************************************/
{
int n;
union
{
double x;
unsigned short a[4];
} u;
n = 0;
u.x = value;
if( value != 0.0 )
{
n = (u.a[3] & 0x7ff0) >> 4;
n -= 0x03fe;
u.a[3] &= 0x800f;
u.a[3] |= 0x3fe0;
}
*exp = n;
return( u.x );
}
double log(double x)
/***********************************/
{
int exp;
double z;
if( x <= 0.0 )
{
BUG();
x = 0; // who cares? :)
}
else
{
x = frexp( x, &exp );
z = x - .5;
if( x > sqrt_of_half )
{
z -= .5;
}
else
{
x = z;
--exp;
}
z = z / (x * .5 + .5);
x = z * z;
x = z + z * x * _EvalPoly( x, APoly, 2 ) / _EvalPoly( x, BPoly, 3 );
if( exp != 0 )
{
z = exp;
x = (z * C2 + x) + z * C1;
}
}
return( x );
}
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Cotulla");
MODULE_DESCRIPTION("htcleo log function");
// END OF FILE