* eina: Fix precision of eina_f32p32_div.
authorcedric <cedric>
Mon, 7 Dec 2009 17:48:40 +0000 (17:48 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 7 Dec 2009 17:48:40 +0000 (17:48 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/eina@44252 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/include/eina_inline_f32p32.x

index a5e4775..4caa970 100644 (file)
@@ -58,8 +58,19 @@ eina_f32p32_scale(Eina_F32p32 a, int b)
 static inline Eina_F32p32
 eina_f32p32_div(Eina_F32p32 a, Eina_F32p32 b)
 {
-   /* If a > 2³², you will have a wrong result due to overflow. */
-   return (a << 32) / b;
+   /* Prevent overflow and do '(a << 32) / b' */
+   /* f32p64 / f32p32 = f32p32 */
+   /* f32p32 / f32p32 = f32p0 */
+   Eina_F32p32 up;
+   Eina_F32p32 down;
+   Eina_F32p32 result;
+
+   up = (a / b) << 32;
+   down = (a << 32) / b;
+
+   result = up + down;
+
+   return result;
 }
 
 static inline Eina_F32p32