git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/embryo@72112
7cbeb6ba-43b4-40fd-8cce-
4c39aea84d33
2012-04-26 Carsten Haitzler (The Rasterman)
1.2.0 release
2012-04-26 Carsten Haitzler (The Rasterman)
1.2.0 release
+
+2012-06-14 Carsten Haitzler (The Rasterman)
+
+ * Fix divide by 0 possibilities in the fp support so no FPE is
+ produced (bad).
+
#include "embryo_private.h"
#define PI 3.1415926535897932384626433832795f
#include "embryo_private.h"
#define PI 3.1415926535897932384626433832795f
+#ifndef MAXFLOAT
+#define MAXFLOAT 3.40282347e+38f
+#endif
/* internally useful calls */
/* internally useful calls */
{
/* params[1] = float dividend (top) */
/* params[2] = float divisor (bottom) */
{
/* params[1] = float dividend (top) */
/* params[2] = float divisor (bottom) */
if (params[0] != (2 * sizeof(Embryo_Cell))) return 0;
if (params[0] != (2 * sizeof(Embryo_Cell))) return 0;
- f = EMBRYO_CELL_TO_FLOAT(params[1]) / EMBRYO_CELL_TO_FLOAT(params[2]);
+ f = EMBRYO_CELL_TO_FLOAT(params[1]);
+ ff = EMBRYO_CELL_TO_FLOAT(params[2]);
+ if (ff == 0.0)
+ {
+ if (f == 0.0)
+ return EMBRYO_FLOAT_TO_CELL(0.0f);
+ else if (f < 0.0)
+ return EMBRYO_FLOAT_TO_CELL(-MAXFLOAT);
+ else
+ return EMBRYO_FLOAT_TO_CELL(MAXFLOAT);
+ }
+ f = f / ff;
return EMBRYO_FLOAT_TO_CELL(f);
}
return EMBRYO_FLOAT_TO_CELL(f);
}
{
/* params[1] = float operand 1 (value) */
/* params[2] = float operand 2 (base) */
{
/* params[1] = float operand 1 (value) */
/* params[2] = float operand 2 (base) */
if (params[0] != (2 * sizeof(Embryo_Cell))) return 0;
f = EMBRYO_CELL_TO_FLOAT(params[1]);
if (params[0] != (2 * sizeof(Embryo_Cell))) return 0;
f = EMBRYO_CELL_TO_FLOAT(params[1]);
}
if (ff == 10.0) f = log10f(f);
else if (ff == 2.0) f = log2f(f);
}
if (ff == 10.0) f = log10f(f);
else if (ff == 2.0) f = log2f(f);
- else f = (logf(f) / logf(ff));
+ else
+ {
+ tf = logf(ff);
+ if (tf == 0.0) f = 0.0;
+ else f = (logf(f) / tf);
+ }
return EMBRYO_FLOAT_TO_CELL(f);
}
return EMBRYO_FLOAT_TO_CELL(f);
}