mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 14:12:06 +00:00
ASoC: remove copy of intlog10()
Merge series from Andy Shevchenko <andriy.shevchenko@linux.intel.com>: The first three patches moves intlog10() to be available in entire kernel. The last one removes copy of it in one driver. Besides already good Lines of Code (LoC) statistics the upcoming users, if any, can utilize the exported functions. The series can be routed via ASoC tree (as Mauro suggested). Note, int_log.h is separated from math.h due to licensing. I dunno if we can mix two in a single header file. In any case we may do it later on.
This commit is contained in:
commit
441511aeea
@ -162,8 +162,11 @@ Base 2 log and power Functions
|
||||
.. kernel-doc:: include/linux/log2.h
|
||||
:internal:
|
||||
|
||||
Integer power Functions
|
||||
-----------------------
|
||||
Integer log and power Functions
|
||||
-------------------------------
|
||||
|
||||
.. kernel-doc:: include/linux/int_log.h
|
||||
:export:
|
||||
|
||||
.. kernel-doc:: lib/math/int_pow.c
|
||||
:export:
|
||||
|
@ -3,15 +3,6 @@
|
||||
Digital TV Common functions
|
||||
---------------------------
|
||||
|
||||
Math functions
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
Provide some commonly-used math functions, usually required in order to
|
||||
estimate signal strength and signal to noise measurements in dB.
|
||||
|
||||
.. kernel-doc:: include/media/dvb_math.h
|
||||
|
||||
|
||||
DVB devices
|
||||
~~~~~~~~~~~
|
||||
|
||||
|
@ -8,6 +8,6 @@ dvb-vb2-$(CONFIG_DVB_MMAP) := dvb_vb2.o
|
||||
|
||||
dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o \
|
||||
dvb_ca_en50221.o dvb_frontend.o \
|
||||
$(dvb-net-y) dvb_ringbuffer.o $(dvb-vb2-y) dvb_math.o
|
||||
$(dvb-net-y) dvb_ringbuffer.o $(dvb-vb2-y)
|
||||
|
||||
obj-$(CONFIG_DVB_CORE) += dvb-core.o
|
||||
|
@ -12,7 +12,7 @@
|
||||
#define AF9013_PRIV_H
|
||||
|
||||
#include <media/dvb_frontend.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include "af9013.h"
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/i2c-mux.h>
|
||||
|
@ -14,7 +14,7 @@
|
||||
#include <linux/math64.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
|
||||
struct reg_val {
|
||||
u32 reg;
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
#include <linux/dvb/version.h>
|
||||
#include <media/dvb_frontend.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include "cxd2820r.h"
|
||||
#include <linux/gpio/driver.h> /* For gpio_chip */
|
||||
#include <linux/math64.h>
|
||||
|
@ -22,7 +22,7 @@
|
||||
#include <linux/dynamic_debug.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "cxd2841er.h"
|
||||
#include "cxd2841er_priv.h"
|
||||
|
@ -11,7 +11,7 @@
|
||||
#include "cxd2880_tnrdmd_dvbt2.h"
|
||||
#include "cxd2880_tnrdmd_dvbt2_mon.h"
|
||||
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
|
||||
static const int ref_dbm_1000[4][8] = {
|
||||
{-96000, -95000, -94000, -93000, -92000, -92000, -98000, -97000},
|
||||
|
@ -11,7 +11,7 @@
|
||||
#include "cxd2880_tnrdmd_dvbt.h"
|
||||
#include "cxd2880_tnrdmd_dvbt_mon.h"
|
||||
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
|
||||
static const int ref_dbm_1000[3][5] = {
|
||||
{-93000, -91000, -90000, -89000, -88000},
|
||||
|
@ -11,7 +11,7 @@
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
#include <media/dvb_frontend.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
|
||||
#include "cxd2880.h"
|
||||
#include "cxd2880_tnrdmd_mon.h"
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include <linux/mutex.h>
|
||||
#include <asm/div64.h>
|
||||
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include <media/dvb_frontend.h>
|
||||
|
||||
#include "dib7000p.h"
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include <linux/mutex.h>
|
||||
#include <asm/div64.h>
|
||||
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
|
||||
#include <media/dvb_frontend.h>
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include <media/dvb_frontend.h>
|
||||
|
||||
#include "dib9000.h"
|
||||
|
@ -20,7 +20,7 @@
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "drxk.h"
|
||||
#include "drxk_hard.h"
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
|
||||
static int power_down_dvbt(struct drxk_state *state, bool set_power_mode);
|
||||
static int power_down_qam(struct drxk_state *state);
|
||||
|
@ -10,7 +10,7 @@
|
||||
#include <asm/div64.h>
|
||||
#include <linux/dvb/frontend.h>
|
||||
#include <linux/slab.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include "lgdt3305.h"
|
||||
|
||||
static int debug;
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include <asm/div64.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/dvb/frontend.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include "lgdt3306a.h"
|
||||
#include <linux/i2c-mux.h>
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#include <media/dvb_frontend.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include "lgdt330x_priv.h"
|
||||
#include "lgdt330x.h"
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "m88ds3103.h"
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/i2c-mux.h>
|
||||
#include <linux/regmap.h>
|
||||
|
@ -10,7 +10,7 @@
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
|
||||
#include "mn88443x.h"
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
#define MN88472_PRIV_H
|
||||
|
||||
#include <media/dvb_frontend.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include "mn88472.h"
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/regmap.h>
|
||||
|
@ -9,7 +9,7 @@
|
||||
#define MN88473_PRIV_H
|
||||
|
||||
#include <media/dvb_frontend.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include "mn88473.h"
|
||||
#include <linux/math64.h>
|
||||
#include <linux/firmware.h>
|
||||
|
@ -27,7 +27,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "or51132.h"
|
||||
|
||||
|
@ -26,7 +26,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "or51211.h"
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
#define RTL2830_PRIV_H
|
||||
|
||||
#include <media/dvb_frontend.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include "rtl2830.h"
|
||||
#include <linux/i2c-mux.h>
|
||||
#include <linux/math64.h>
|
||||
|
@ -14,7 +14,7 @@
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <media/dvb_frontend.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include "rtl2832.h"
|
||||
|
||||
struct rtl2832_dev {
|
||||
|
@ -19,7 +19,7 @@
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <media/dvb_frontend.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include "si2165_priv.h"
|
||||
#include "si2165.h"
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/i2c.h>
|
||||
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
|
||||
#include "stv0367.h"
|
||||
#include "stv0367_defs.h"
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/math64.h>
|
||||
#include <linux/dvb/frontend.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include "tc90522.h"
|
||||
|
||||
#define TC90522_I2C_THRU_REG 0xfe
|
||||
|
@ -16,7 +16,7 @@
|
||||
#include <linux/math64.h>
|
||||
#include <asm/div64.h>
|
||||
#include <media/dvb_frontend.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include <linux/int_log.h>
|
||||
#include "tda10048.h"
|
||||
|
||||
#define TDA10048_DEFAULT_FIRMWARE "dvb-fe-tda10048-1.0.fw"
|
||||
|
@ -1,22 +1,12 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
/*
|
||||
* dvb-math provides some complex fixed-point math
|
||||
* operations shared between the dvb related stuff
|
||||
* Provides fixed-point logarithm operations.
|
||||
*
|
||||
* Copyright (C) 2006 Christoph Pfister (christophpfister@gmail.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* 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 Lesser General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __DVB_MATH_H
|
||||
#define __DVB_MATH_H
|
||||
#ifndef __LINUX_INT_LOG_H
|
||||
#define __LINUX_INT_LOG_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
@ -1,5 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
obj-y += div64.o gcd.o lcm.o int_pow.o int_sqrt.o reciprocal_div.o
|
||||
obj-y += div64.o gcd.o lcm.o int_log.o int_pow.o int_sqrt.o reciprocal_div.o
|
||||
|
||||
obj-$(CONFIG_CORDIC) += cordic.o
|
||||
obj-$(CONFIG_PRIME_NUMBERS) += prime_numbers.o
|
||||
|
@ -1,25 +1,17 @@
|
||||
// SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
/*
|
||||
* dvb-math provides some complex fixed-point math
|
||||
* operations shared between the dvb related stuff
|
||||
* Provides fixed-point logarithm operations.
|
||||
*
|
||||
* Copyright (C) 2006 Christoph Pfister (christophpfister@gmail.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* 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 Lesser General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/int_log.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <asm/bug.h>
|
||||
#include <media/dvb_math.h>
|
||||
|
||||
static const unsigned short logtable[256] = {
|
||||
0x0000, 0x0171, 0x02e0, 0x044e, 0x05ba, 0x0725, 0x088e, 0x09f7,
|
||||
@ -53,7 +45,7 @@ static const unsigned short logtable[256] = {
|
||||
0xe82a, 0xe8ef, 0xe9b3, 0xea77, 0xeb3b, 0xebfe, 0xecc1, 0xed83,
|
||||
0xee45, 0xef06, 0xefc8, 0xf088, 0xf149, 0xf209, 0xf2c8, 0xf387,
|
||||
0xf446, 0xf505, 0xf5c3, 0xf680, 0xf73e, 0xf7fb, 0xf8b7, 0xf973,
|
||||
0xfa2f, 0xfaea, 0xfba5, 0xfc60, 0xfd1a, 0xfdd4, 0xfe8e, 0xff47
|
||||
0xfa2f, 0xfaea, 0xfba5, 0xfc60, 0xfd1a, 0xfdd4, 0xfe8e, 0xff47,
|
||||
};
|
||||
|
||||
unsigned int intlog2(u32 value)
|
||||
@ -90,7 +82,7 @@ unsigned int intlog2(u32 value)
|
||||
* so we would use the entry 0x18
|
||||
*/
|
||||
significand = value << (31 - msb);
|
||||
logentry = (significand >> 23) & 0xff;
|
||||
logentry = (significand >> 23) % ARRAY_SIZE(logtable);
|
||||
|
||||
/**
|
||||
* last step we do is interpolation because of the
|
||||
@ -108,7 +100,7 @@ unsigned int intlog2(u32 value)
|
||||
* logtable_next is 256
|
||||
*/
|
||||
interpolation = ((significand & 0x7fffff) *
|
||||
((logtable[(logentry + 1) & 0xff] -
|
||||
((logtable[(logentry + 1) % ARRAY_SIZE(logtable)] -
|
||||
logtable[logentry]) & 0xffff)) >> 15;
|
||||
|
||||
/* now we return the result */
|
@ -11,6 +11,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/int_log.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/slab.h>
|
||||
@ -38,7 +39,6 @@
|
||||
#define NAU_FVCO_MIN 90000000
|
||||
|
||||
/* cross talk suppression detection */
|
||||
#define LOG10_MAGIC 646456993
|
||||
#define GAIN_AUGMENT 22500
|
||||
#define SIDETONE_BASE 207000
|
||||
|
||||
@ -219,42 +219,6 @@ static const struct reg_sequence nau8825_regmap_patch[] = {
|
||||
{ NAU8825_REG_MIC_BIAS, 0x0046 },
|
||||
};
|
||||
|
||||
|
||||
static const unsigned short logtable[256] = {
|
||||
0x0000, 0x0171, 0x02e0, 0x044e, 0x05ba, 0x0725, 0x088e, 0x09f7,
|
||||
0x0b5d, 0x0cc3, 0x0e27, 0x0f8a, 0x10eb, 0x124b, 0x13aa, 0x1508,
|
||||
0x1664, 0x17bf, 0x1919, 0x1a71, 0x1bc8, 0x1d1e, 0x1e73, 0x1fc6,
|
||||
0x2119, 0x226a, 0x23ba, 0x2508, 0x2656, 0x27a2, 0x28ed, 0x2a37,
|
||||
0x2b80, 0x2cc8, 0x2e0f, 0x2f54, 0x3098, 0x31dc, 0x331e, 0x345f,
|
||||
0x359f, 0x36de, 0x381b, 0x3958, 0x3a94, 0x3bce, 0x3d08, 0x3e41,
|
||||
0x3f78, 0x40af, 0x41e4, 0x4319, 0x444c, 0x457f, 0x46b0, 0x47e1,
|
||||
0x4910, 0x4a3f, 0x4b6c, 0x4c99, 0x4dc5, 0x4eef, 0x5019, 0x5142,
|
||||
0x526a, 0x5391, 0x54b7, 0x55dc, 0x5700, 0x5824, 0x5946, 0x5a68,
|
||||
0x5b89, 0x5ca8, 0x5dc7, 0x5ee5, 0x6003, 0x611f, 0x623a, 0x6355,
|
||||
0x646f, 0x6588, 0x66a0, 0x67b7, 0x68ce, 0x69e4, 0x6af8, 0x6c0c,
|
||||
0x6d20, 0x6e32, 0x6f44, 0x7055, 0x7165, 0x7274, 0x7383, 0x7490,
|
||||
0x759d, 0x76aa, 0x77b5, 0x78c0, 0x79ca, 0x7ad3, 0x7bdb, 0x7ce3,
|
||||
0x7dea, 0x7ef0, 0x7ff6, 0x80fb, 0x81ff, 0x8302, 0x8405, 0x8507,
|
||||
0x8608, 0x8709, 0x8809, 0x8908, 0x8a06, 0x8b04, 0x8c01, 0x8cfe,
|
||||
0x8dfa, 0x8ef5, 0x8fef, 0x90e9, 0x91e2, 0x92db, 0x93d2, 0x94ca,
|
||||
0x95c0, 0x96b6, 0x97ab, 0x98a0, 0x9994, 0x9a87, 0x9b7a, 0x9c6c,
|
||||
0x9d5e, 0x9e4f, 0x9f3f, 0xa02e, 0xa11e, 0xa20c, 0xa2fa, 0xa3e7,
|
||||
0xa4d4, 0xa5c0, 0xa6ab, 0xa796, 0xa881, 0xa96a, 0xaa53, 0xab3c,
|
||||
0xac24, 0xad0c, 0xadf2, 0xaed9, 0xafbe, 0xb0a4, 0xb188, 0xb26c,
|
||||
0xb350, 0xb433, 0xb515, 0xb5f7, 0xb6d9, 0xb7ba, 0xb89a, 0xb97a,
|
||||
0xba59, 0xbb38, 0xbc16, 0xbcf4, 0xbdd1, 0xbead, 0xbf8a, 0xc065,
|
||||
0xc140, 0xc21b, 0xc2f5, 0xc3cf, 0xc4a8, 0xc580, 0xc658, 0xc730,
|
||||
0xc807, 0xc8de, 0xc9b4, 0xca8a, 0xcb5f, 0xcc34, 0xcd08, 0xcddc,
|
||||
0xceaf, 0xcf82, 0xd054, 0xd126, 0xd1f7, 0xd2c8, 0xd399, 0xd469,
|
||||
0xd538, 0xd607, 0xd6d6, 0xd7a4, 0xd872, 0xd93f, 0xda0c, 0xdad9,
|
||||
0xdba5, 0xdc70, 0xdd3b, 0xde06, 0xded0, 0xdf9a, 0xe063, 0xe12c,
|
||||
0xe1f5, 0xe2bd, 0xe385, 0xe44c, 0xe513, 0xe5d9, 0xe69f, 0xe765,
|
||||
0xe82a, 0xe8ef, 0xe9b3, 0xea77, 0xeb3b, 0xebfe, 0xecc1, 0xed83,
|
||||
0xee45, 0xef06, 0xefc8, 0xf088, 0xf149, 0xf209, 0xf2c8, 0xf387,
|
||||
0xf446, 0xf505, 0xf5c3, 0xf680, 0xf73e, 0xf7fb, 0xf8b7, 0xf973,
|
||||
0xfa2f, 0xfaea, 0xfba5, 0xfc60, 0xfd1a, 0xfdd4, 0xfe8e, 0xff47
|
||||
};
|
||||
|
||||
/**
|
||||
* nau8825_sema_acquire - acquire the semaphore of nau88l25
|
||||
* @nau8825: component to register the codec private data with
|
||||
@ -368,65 +332,14 @@ static void nau8825_hpvol_ramp(struct nau8825 *nau8825,
|
||||
}
|
||||
|
||||
/**
|
||||
* nau8825_intlog10_dec3 - Computes log10 of a value
|
||||
* the result is round off to 3 decimal. This function takes reference to
|
||||
* dvb-math. The source code locates as the following.
|
||||
* Linux/drivers/media/dvb-core/dvb_math.c
|
||||
* nau8825_intlog10_dec3 - Computes log10 of a value, rounding the result to 3 decimal places.
|
||||
* @value: input for log10
|
||||
*
|
||||
* return log10(value) * 1000
|
||||
*/
|
||||
static u32 nau8825_intlog10_dec3(u32 value)
|
||||
{
|
||||
u32 msb, logentry, significand, interpolation, log10val;
|
||||
u64 log2val;
|
||||
|
||||
/* first detect the msb (count begins at 0) */
|
||||
msb = fls(value) - 1;
|
||||
/**
|
||||
* now we use a logtable after the following method:
|
||||
*
|
||||
* log2(2^x * y) * 2^24 = x * 2^24 + log2(y) * 2^24
|
||||
* where x = msb and therefore 1 <= y < 2
|
||||
* first y is determined by shifting the value left
|
||||
* so that msb is bit 31
|
||||
* 0x00231f56 -> 0x8C7D5800
|
||||
* the result is y * 2^31 -> "significand"
|
||||
* then the highest 9 bits are used for a table lookup
|
||||
* the highest bit is discarded because it's always set
|
||||
* the highest nine bits in our example are 100011000
|
||||
* so we would use the entry 0x18
|
||||
*/
|
||||
significand = value << (31 - msb);
|
||||
logentry = (significand >> 23) & 0xff;
|
||||
/**
|
||||
* last step we do is interpolation because of the
|
||||
* limitations of the log table the error is that part of
|
||||
* the significand which isn't used for lookup then we
|
||||
* compute the ratio between the error and the next table entry
|
||||
* and interpolate it between the log table entry used and the
|
||||
* next one the biggest error possible is 0x7fffff
|
||||
* (in our example it's 0x7D5800)
|
||||
* needed value for next table entry is 0x800000
|
||||
* so the interpolation is
|
||||
* (error / 0x800000) * (logtable_next - logtable_current)
|
||||
* in the implementation the division is moved to the end for
|
||||
* better accuracy there is also an overflow correction if
|
||||
* logtable_next is 256
|
||||
*/
|
||||
interpolation = ((significand & 0x7fffff) *
|
||||
((logtable[(logentry + 1) & 0xff] -
|
||||
logtable[logentry]) & 0xffff)) >> 15;
|
||||
|
||||
log2val = ((msb << 24) + (logtable[logentry] << 8) + interpolation);
|
||||
/**
|
||||
* log10(x) = log2(x) * log10(2)
|
||||
*/
|
||||
log10val = (log2val * LOG10_MAGIC) >> 31;
|
||||
/**
|
||||
* the result is round off to 3 decimal
|
||||
*/
|
||||
return log10val / ((1 << 24) / 1000);
|
||||
return intlog10(value) / ((1 << 24) / 1000);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user