MloFloatFpu.h

00001 /*****************************************************************
00002 |
00003 |    Copyright 2004-2006 Axiomatic Systems LLC
00004 |
00005 |    This file is part of Melo (Melo AAC Decoder).
00006 |
00007 |    Unless you have obtained Melo under a difference license,
00008 |    this version of Melo is Melo|GPL.
00009 |    Melo|GPL is free software; you can redistribute it and/or modify
00010 |    it under the terms of the GNU General Public License as published by
00011 |    the Free Software Foundation; either version 2, or (at your option)
00012 |    any later version.
00013 |
00014 |    Melo|GPL is distributed in the hope that it will be useful,
00015 |    but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 |    GNU General Public License for more details.
00018 |
00019 |    You should have received a copy of the GNU General Public License
00020 |    along with Melo|GPL; see the file COPYING.  If not, write to the
00021 |    Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
00022 |    02111-1307, USA.
00023 |
00024  ****************************************************************/
00025 
00026 #ifndef _MLO_FLOAT_FPU_H_
00027 #define _MLO_FLOAT_FPU_H_
00028 
00029 
00030 
00031 #if ! defined (_MLO_FLOAT_H_)
00032 #error This header can be included only by MloFloat.h
00033 #endif
00034 
00035 
00036 
00037 /*----------------------------------------------------------------------
00038 |       Includes
00039 +---------------------------------------------------------------------*/
00040 
00041 
00042 
00043 #include "MloConfig.h"
00044 #include "MloDebug.h"
00045 
00046 #if defined(MLO_CONFIG_HAVE_MATH_H)
00047 #include <math.h>
00048 #endif
00049 
00050 
00051 
00052 /*----------------------------------------------------------------------
00053 |       Definitions
00054 +---------------------------------------------------------------------*/
00055 
00056 
00057 
00058 typedef  float MLO_Float;
00059 
00060 #define  MLO_FLOAT_C(x) ((float) (x))
00061 
00062 
00063 
00064 enum
00065 {
00066    MLO_FLOAT_TABLE_P2_MIN  = -126,
00067    MLO_FLOAT_TABLE_P2_MAX  = +126,
00068    MLO_FLOAT_TABLE_P2_LEN  = MLO_FLOAT_TABLE_P2_MAX - MLO_FLOAT_TABLE_P2_MIN + 1
00069 };
00070 
00071 static const MLO_Float MLO_Float_table_p2 [MLO_FLOAT_TABLE_P2_LEN] =
00072 {
00073    MLO_FLOAT_C (1.17549435e-038),
00074    MLO_FLOAT_C (2.3509887e-038),
00075    MLO_FLOAT_C (4.7019774e-038),
00076    MLO_FLOAT_C (9.40395481e-038),
00077    MLO_FLOAT_C (1.88079096e-037),
00078    MLO_FLOAT_C (3.76158192e-037),
00079    MLO_FLOAT_C (7.52316385e-037),
00080    MLO_FLOAT_C (1.50463277e-036),
00081    MLO_FLOAT_C (3.00926554e-036),
00082    MLO_FLOAT_C (6.01853108e-036),
00083    MLO_FLOAT_C (1.20370622e-035),
00084    MLO_FLOAT_C (2.40741243e-035),
00085    MLO_FLOAT_C (4.81482486e-035),
00086    MLO_FLOAT_C (9.62964972e-035),
00087    MLO_FLOAT_C (1.92592994e-034),
00088    MLO_FLOAT_C (3.85185989e-034),
00089    MLO_FLOAT_C (7.70371978e-034),
00090    MLO_FLOAT_C (1.54074396e-033),
00091    MLO_FLOAT_C (3.08148791e-033),
00092    MLO_FLOAT_C (6.16297582e-033),
00093    MLO_FLOAT_C (1.23259516e-032),
00094    MLO_FLOAT_C (2.46519033e-032),
00095    MLO_FLOAT_C (4.93038066e-032),
00096    MLO_FLOAT_C (9.86076132e-032),
00097    MLO_FLOAT_C (1.97215226e-031),
00098    MLO_FLOAT_C (3.94430453e-031),
00099    MLO_FLOAT_C (7.88860905e-031),
00100    MLO_FLOAT_C (1.57772181e-030),
00101    MLO_FLOAT_C (3.15544362e-030),
00102    MLO_FLOAT_C (6.31088724e-030),
00103    MLO_FLOAT_C (1.26217745e-029),
00104    MLO_FLOAT_C (2.5243549e-029),
00105    MLO_FLOAT_C (5.04870979e-029),
00106    MLO_FLOAT_C (1.00974196e-028),
00107    MLO_FLOAT_C (2.01948392e-028),
00108    MLO_FLOAT_C (4.03896783e-028),
00109    MLO_FLOAT_C (8.07793567e-028),
00110    MLO_FLOAT_C (1.61558713e-027),
00111    MLO_FLOAT_C (3.23117427e-027),
00112    MLO_FLOAT_C (6.46234854e-027),
00113    MLO_FLOAT_C (1.29246971e-026),
00114    MLO_FLOAT_C (2.58493941e-026),
00115    MLO_FLOAT_C (5.16987883e-026),
00116    MLO_FLOAT_C (1.03397577e-025),
00117    MLO_FLOAT_C (2.06795153e-025),
00118    MLO_FLOAT_C (4.13590306e-025),
00119    MLO_FLOAT_C (8.27180613e-025),
00120    MLO_FLOAT_C (1.65436123e-024),
00121    MLO_FLOAT_C (3.30872245e-024),
00122    MLO_FLOAT_C (6.6174449e-024),
00123    MLO_FLOAT_C (1.32348898e-023),
00124    MLO_FLOAT_C (2.64697796e-023),
00125    MLO_FLOAT_C (5.29395592e-023),
00126    MLO_FLOAT_C (1.05879118e-022),
00127    MLO_FLOAT_C (2.11758237e-022),
00128    MLO_FLOAT_C (4.23516474e-022),
00129    MLO_FLOAT_C (8.47032947e-022),
00130    MLO_FLOAT_C (1.69406589e-021),
00131    MLO_FLOAT_C (3.38813179e-021),
00132    MLO_FLOAT_C (6.77626358e-021),
00133    MLO_FLOAT_C (1.35525272e-020),
00134    MLO_FLOAT_C (2.71050543e-020),
00135    MLO_FLOAT_C (5.42101086e-020),
00136    MLO_FLOAT_C (1.08420217e-019),
00137    MLO_FLOAT_C (2.16840434e-019),
00138    MLO_FLOAT_C (4.33680869e-019),
00139    MLO_FLOAT_C (8.67361738e-019),
00140    MLO_FLOAT_C (1.73472348e-018),
00141    MLO_FLOAT_C (3.46944695e-018),
00142    MLO_FLOAT_C (6.9388939e-018),
00143    MLO_FLOAT_C (1.38777878e-017),
00144    MLO_FLOAT_C (2.77555756e-017),
00145    MLO_FLOAT_C (5.55111512e-017),
00146    MLO_FLOAT_C (1.11022302e-016),
00147    MLO_FLOAT_C (2.22044605e-016),
00148    MLO_FLOAT_C (4.4408921e-016),
00149    MLO_FLOAT_C (8.8817842e-016),
00150    MLO_FLOAT_C (1.77635684e-015),
00151    MLO_FLOAT_C (3.55271368e-015),
00152    MLO_FLOAT_C (7.10542736e-015),
00153    MLO_FLOAT_C (1.42108547e-014),
00154    MLO_FLOAT_C (2.84217094e-014),
00155    MLO_FLOAT_C (5.68434189e-014),
00156    MLO_FLOAT_C (1.13686838e-013),
00157    MLO_FLOAT_C (2.27373675e-013),
00158    MLO_FLOAT_C (4.54747351e-013),
00159    MLO_FLOAT_C (9.09494702e-013),
00160    MLO_FLOAT_C (1.8189894e-012),
00161    MLO_FLOAT_C (3.63797881e-012),
00162    MLO_FLOAT_C (7.27595761e-012),
00163    MLO_FLOAT_C (1.45519152e-011),
00164    MLO_FLOAT_C (2.91038305e-011),
00165    MLO_FLOAT_C (5.82076609e-011),
00166    MLO_FLOAT_C (1.16415322e-010),
00167    MLO_FLOAT_C (2.32830644e-010),
00168    MLO_FLOAT_C (4.65661287e-010),
00169    MLO_FLOAT_C (9.31322575e-010),
00170    MLO_FLOAT_C (1.86264515e-009),
00171    MLO_FLOAT_C (3.7252903e-009),
00172    MLO_FLOAT_C (7.4505806e-009),
00173    MLO_FLOAT_C (1.49011612e-008),
00174    MLO_FLOAT_C (2.98023224e-008),
00175    MLO_FLOAT_C (5.96046448e-008),
00176    MLO_FLOAT_C (1.1920929e-007),
00177    MLO_FLOAT_C (2.38418579e-007),
00178    MLO_FLOAT_C (4.76837158e-007),
00179    MLO_FLOAT_C (9.53674316e-007),
00180    MLO_FLOAT_C (1.90734863e-006),
00181    MLO_FLOAT_C (3.81469727e-006),
00182    MLO_FLOAT_C (7.62939453e-006),
00183    MLO_FLOAT_C (1.52587891e-005),
00184    MLO_FLOAT_C (3.05175781e-005),
00185    MLO_FLOAT_C (6.10351563e-005),
00186    MLO_FLOAT_C (0.000122070313),
00187    MLO_FLOAT_C (0.000244140625),
00188    MLO_FLOAT_C (0.00048828125),
00189    MLO_FLOAT_C (0.0009765625),
00190    MLO_FLOAT_C (0.001953125),
00191    MLO_FLOAT_C (0.00390625),
00192    MLO_FLOAT_C (0.0078125),
00193    MLO_FLOAT_C (0.015625),
00194    MLO_FLOAT_C (0.03125),
00195    MLO_FLOAT_C (0.0625),
00196    MLO_FLOAT_C (0.125),
00197    MLO_FLOAT_C (0.25),
00198    MLO_FLOAT_C (0.5),
00199    MLO_FLOAT_C (1),
00200    MLO_FLOAT_C (2),
00201    MLO_FLOAT_C (4),
00202    MLO_FLOAT_C (8),
00203    MLO_FLOAT_C (16),
00204    MLO_FLOAT_C (32),
00205    MLO_FLOAT_C (64),
00206    MLO_FLOAT_C (128),
00207    MLO_FLOAT_C (256),
00208    MLO_FLOAT_C (512),
00209    MLO_FLOAT_C (1024),
00210    MLO_FLOAT_C (2048),
00211    MLO_FLOAT_C (4096),
00212    MLO_FLOAT_C (8192),
00213    MLO_FLOAT_C (16384),
00214    MLO_FLOAT_C (32768),
00215    MLO_FLOAT_C (65536),
00216    MLO_FLOAT_C (131072),
00217    MLO_FLOAT_C (262144),
00218    MLO_FLOAT_C (524288),
00219    MLO_FLOAT_C (1048576),
00220    MLO_FLOAT_C (2097152),
00221    MLO_FLOAT_C (4194304),
00222    MLO_FLOAT_C (8388608),
00223    MLO_FLOAT_C (16777216),
00224    MLO_FLOAT_C (33554432),
00225    MLO_FLOAT_C (67108864),
00226    MLO_FLOAT_C (134217728),
00227    MLO_FLOAT_C (268435456),
00228    MLO_FLOAT_C (536870912),
00229    MLO_FLOAT_C (1.07374182e+009),
00230    MLO_FLOAT_C (2.14748365e+009),
00231    MLO_FLOAT_C (4.2949673e+009),
00232    MLO_FLOAT_C (8.58993459e+009),
00233    MLO_FLOAT_C (1.71798692e+010),
00234    MLO_FLOAT_C (3.43597384e+010),
00235    MLO_FLOAT_C (6.87194767e+010),
00236    MLO_FLOAT_C (1.37438953e+011),
00237    MLO_FLOAT_C (2.74877907e+011),
00238    MLO_FLOAT_C (5.49755814e+011),
00239    MLO_FLOAT_C (1.09951163e+012),
00240    MLO_FLOAT_C (2.19902326e+012),
00241    MLO_FLOAT_C (4.39804651e+012),
00242    MLO_FLOAT_C (8.79609302e+012),
00243    MLO_FLOAT_C (1.7592186e+013),
00244    MLO_FLOAT_C (3.51843721e+013),
00245    MLO_FLOAT_C (7.03687442e+013),
00246    MLO_FLOAT_C (1.40737488e+014),
00247    MLO_FLOAT_C (2.81474977e+014),
00248    MLO_FLOAT_C (5.62949953e+014),
00249    MLO_FLOAT_C (1.12589991e+015),
00250    MLO_FLOAT_C (2.25179981e+015),
00251    MLO_FLOAT_C (4.50359963e+015),
00252    MLO_FLOAT_C (9.00719925e+015),
00253    MLO_FLOAT_C (1.80143985e+016),
00254    MLO_FLOAT_C (3.6028797e+016),
00255    MLO_FLOAT_C (7.2057594e+016),
00256    MLO_FLOAT_C (1.44115188e+017),
00257    MLO_FLOAT_C (2.88230376e+017),
00258    MLO_FLOAT_C (5.76460752e+017),
00259    MLO_FLOAT_C (1.1529215e+018),
00260    MLO_FLOAT_C (2.30584301e+018),
00261    MLO_FLOAT_C (4.61168602e+018),
00262    MLO_FLOAT_C (9.22337204e+018),
00263    MLO_FLOAT_C (1.84467441e+019),
00264    MLO_FLOAT_C (3.68934881e+019),
00265    MLO_FLOAT_C (7.37869763e+019),
00266    MLO_FLOAT_C (1.47573953e+020),
00267    MLO_FLOAT_C (2.95147905e+020),
00268    MLO_FLOAT_C (5.9029581e+020),
00269    MLO_FLOAT_C (1.18059162e+021),
00270    MLO_FLOAT_C (2.36118324e+021),
00271    MLO_FLOAT_C (4.72236648e+021),
00272    MLO_FLOAT_C (9.44473297e+021),
00273    MLO_FLOAT_C (1.88894659e+022),
00274    MLO_FLOAT_C (3.77789319e+022),
00275    MLO_FLOAT_C (7.55578637e+022),
00276    MLO_FLOAT_C (1.51115727e+023),
00277    MLO_FLOAT_C (3.02231455e+023),
00278    MLO_FLOAT_C (6.0446291e+023),
00279    MLO_FLOAT_C (1.20892582e+024),
00280    MLO_FLOAT_C (2.41785164e+024),
00281    MLO_FLOAT_C (4.83570328e+024),
00282    MLO_FLOAT_C (9.67140656e+024),
00283    MLO_FLOAT_C (1.93428131e+025),
00284    MLO_FLOAT_C (3.86856262e+025),
00285    MLO_FLOAT_C (7.73712525e+025),
00286    MLO_FLOAT_C (1.54742505e+026),
00287    MLO_FLOAT_C (3.0948501e+026),
00288    MLO_FLOAT_C (6.1897002e+026),
00289    MLO_FLOAT_C (1.23794004e+027),
00290    MLO_FLOAT_C (2.47588008e+027),
00291    MLO_FLOAT_C (4.95176016e+027),
00292    MLO_FLOAT_C (9.90352031e+027),
00293    MLO_FLOAT_C (1.98070406e+028),
00294    MLO_FLOAT_C (3.96140813e+028),
00295    MLO_FLOAT_C (7.92281625e+028),
00296    MLO_FLOAT_C (1.58456325e+029),
00297    MLO_FLOAT_C (3.1691265e+029),
00298    MLO_FLOAT_C (6.338253e+029),
00299    MLO_FLOAT_C (1.2676506e+030),
00300    MLO_FLOAT_C (2.5353012e+030),
00301    MLO_FLOAT_C (5.0706024e+030),
00302    MLO_FLOAT_C (1.01412048e+031),
00303    MLO_FLOAT_C (2.02824096e+031),
00304    MLO_FLOAT_C (4.05648192e+031),
00305    MLO_FLOAT_C (8.11296384e+031),
00306    MLO_FLOAT_C (1.62259277e+032),
00307    MLO_FLOAT_C (3.24518554e+032),
00308    MLO_FLOAT_C (6.49037107e+032),
00309    MLO_FLOAT_C (1.29807421e+033),
00310    MLO_FLOAT_C (2.59614843e+033),
00311    MLO_FLOAT_C (5.19229686e+033),
00312    MLO_FLOAT_C (1.03845937e+034),
00313    MLO_FLOAT_C (2.07691874e+034),
00314    MLO_FLOAT_C (4.15383749e+034),
00315    MLO_FLOAT_C (8.30767497e+034),
00316    MLO_FLOAT_C (1.66153499e+035),
00317    MLO_FLOAT_C (3.32306999e+035),
00318    MLO_FLOAT_C (6.64613998e+035),
00319    MLO_FLOAT_C (1.329228e+036),
00320    MLO_FLOAT_C (2.65845599e+036),
00321    MLO_FLOAT_C (5.31691198e+036),
00322    MLO_FLOAT_C (1.0633824e+037),
00323    MLO_FLOAT_C (2.12676479e+037),
00324    MLO_FLOAT_C (4.25352959e+037),
00325    MLO_FLOAT_C (8.50705917e+037)
00326 };
00327 
00328 
00329 
00330 /*----------------------------------------------------------------------
00331 |       Functions
00332 +---------------------------------------------------------------------*/
00333 
00334 
00335 
00336 static inline MLO_Float MLO_Float_ConvIntToFloat (int a)
00337 {
00338    return ((MLO_Float) a);
00339 }
00340 
00341 static inline int MLO_Float_RoundInt (MLO_Float a)
00342 {
00343    return ((int) floor (a + 0.5f));
00344 }
00345 
00346 static inline MLO_Float MLO_Float_Add (MLO_Float a, MLO_Float b)
00347 {
00348    return (a + b);
00349 }
00350 
00351 static inline MLO_Float MLO_Float_Sub (MLO_Float a, MLO_Float b)
00352 {
00353    return (a - b);
00354 }
00355 
00356 static inline MLO_Float MLO_Float_Neg (MLO_Float a)
00357 {
00358    return (-a);
00359 }
00360 
00361 static inline MLO_Float MLO_Float_Mul (MLO_Float a, MLO_Float b)
00362 {
00363    return (a * b);
00364 }
00365 
00366 static inline MLO_Float MLO_Float_MulInt (MLO_Float a, int b)
00367 {
00368    return (a * b);
00369 }
00370 
00371 static inline MLO_Float MLO_Float_Div (MLO_Float a, MLO_Float b)
00372 {
00373    MLO_ASSERT (a >= 0);
00374    MLO_ASSERT (b > 0);
00375 
00376    return (a / b);
00377 }
00378 
00379 static inline MLO_Float MLO_Float_DivInt (MLO_Float a, int b)
00380 {
00381    MLO_ASSERT (a >= 0);
00382    MLO_ASSERT (b > 0);
00383 
00384    return (a / b);
00385 }
00386 
00387 static inline MLO_Float MLO_Float_ScaleP2 (MLO_Float a, int b)
00388 {
00389    MLO_ASSERT (b >= MLO_FLOAT_TABLE_P2_MIN);
00390    MLO_ASSERT (b <= MLO_FLOAT_TABLE_P2_MAX);
00391 
00392    return (a * MLO_Float_table_p2 [b - MLO_FLOAT_TABLE_P2_MIN]);
00393 }
00394 
00395 static inline MLO_Float MLO_Float_Sqrt (MLO_Float a)
00396 {
00397    MLO_ASSERT (a >= 0);
00398 
00399 #if defined (MLO_CONFIG_HAVE_SQRT)
00400    return ((MLO_Float) sqrt (a));
00401 #else
00402 #error sqrt() not defined.
00403 #endif
00404 }
00405 
00406 
00407 
00408 #endif   /* _MLO_FLOAT_FPU_H_ */