~cschieli/freebox-embryo/upstream-trunk

« back to all changes in this revision

Viewing changes to src/lib/embryo_float.c

  • Committer: raster
  • Date: 2012-06-14 08:46:58 UTC
  • Revision ID: svn-v4:7cbeb6ba-43b4-40fd-8cce-4c39aea84d33:trunk/embryo:72112
fix divide by 0 possible errors in embryo fp support

Show diffs side-by-side

added added

removed removed

Lines of Context:
48
48
#include "embryo_private.h"
49
49
 
50
50
#define PI  3.1415926535897932384626433832795f
 
51
#ifndef MAXFLOAT
 
52
#define MAXFLOAT 3.40282347e+38f
 
53
#endif
51
54
 
52
55
/* internally useful calls */
53
56
 
114
117
{
115
118
   /* params[1] = float dividend (top) */
116
119
   /* params[2] = float divisor (bottom) */
117
 
   float f;
 
120
   float f, ff;
118
121
 
119
122
   if (params[0] != (2 * sizeof(Embryo_Cell))) return 0;
120
 
   f = EMBRYO_CELL_TO_FLOAT(params[1]) / EMBRYO_CELL_TO_FLOAT(params[2]);
 
123
   f = EMBRYO_CELL_TO_FLOAT(params[1]);
 
124
   ff = EMBRYO_CELL_TO_FLOAT(params[2]);
 
125
   if (ff == 0.0)
 
126
     {
 
127
        if (f == 0.0)
 
128
          return EMBRYO_FLOAT_TO_CELL(0.0f);
 
129
        else if (f < 0.0)
 
130
          return EMBRYO_FLOAT_TO_CELL(-MAXFLOAT);
 
131
        else
 
132
          return EMBRYO_FLOAT_TO_CELL(MAXFLOAT);
 
133
     }
 
134
   f = f / ff;
121
135
   return EMBRYO_FLOAT_TO_CELL(f);
122
136
}
123
137
 
238
252
{
239
253
   /* params[1] = float operand 1 (value) */
240
254
   /* params[2] = float operand 2 (base) */
241
 
   float f, ff;
 
255
   float f, ff, tf;
242
256
 
243
257
   if (params[0] != (2 * sizeof(Embryo_Cell))) return 0;
244
258
   f = EMBRYO_CELL_TO_FLOAT(params[1]);
250
264
     }
251
265
    if (ff == 10.0) f = log10f(f);
252
266
    else if (ff == 2.0) f = log2f(f);
253
 
    else f = (logf(f) / logf(ff));
 
267
    else
 
268
     {
 
269
        tf = logf(ff);
 
270
        if (tf == 0.0) f = 0.0;
 
271
        else f = (logf(f) / tf);
 
272
     }
254
273
    return EMBRYO_FLOAT_TO_CELL(f);
255
274
}
256
275