00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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
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
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
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