diff --git a/ChangeLog b/ChangeLog
index 80cbfef..53dfb9f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2010-08-12  6.6.3-5 Cristy  <quetzlzacatenango@image...>
+  * The -fx 2e+6/1e+5 argument no longer returns the wrong results (reference
+    http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=16833).
+
 2010-08-10  6.6.3-5 Glenn Randers-Pehrson <glennrp@image...>
   * Emit a warning if the PNG encoder can't satisfy the color type and
     bit depth requested with a "-define" directive.
diff --git a/magick/fx.c b/magick/fx.c
index a4b417d..fcf4a1f 100644
--- a/magick/fx.c
+++ b/magick/fx.c
@@ -98,6 +98,7 @@
 #define NotEqualOperator 0xfa
 #define LogicalAndOperator 0xfb
 #define LogicalOrOperator 0xfc
+#define ExponentialNotation 0xfd
 
 struct _FxInfo
 {
@@ -190,29 +191,28 @@
       (strstr(fx_info->expression,"e-") != (char *) NULL))
     {
       /*
-        Convert scientific notation.  '*' and '/' have the same precedence so
-        2e+6/1e+5 fails, instead use '@' to ensure proper results.
+        Convert scientific notation.
       */
-      (void) SubstituteString(&fx_info->expression,"0e+","0@10^");
-      (void) SubstituteString(&fx_info->expression,"1e+","1@10^");
-      (void) SubstituteString(&fx_info->expression,"2e+","2@10^");
-      (void) SubstituteString(&fx_info->expression,"3e+","3@10^");
-      (void) SubstituteString(&fx_info->expression,"4e+","4@10^");
-      (void) SubstituteString(&fx_info->expression,"5e+","5@10^");
-      (void) SubstituteString(&fx_info->expression,"6e+","6@10^");
-      (void) SubstituteString(&fx_info->expression,"7e+","7@10^");
-      (void) SubstituteString(&fx_info->expression,"8e+","8@10^");
-      (void) SubstituteString(&fx_info->expression,"9e+","9@10^");
-      (void) SubstituteString(&fx_info->expression,"0e-","0@10^-");
-      (void) SubstituteString(&fx_info->expression,"1e-","1@10^-");
-      (void) SubstituteString(&fx_info->expression,"2e-","2@10^-");
-      (void) SubstituteString(&fx_info->expression,"3e-","3@10^-");
-      (void) SubstituteString(&fx_info->expression,"4e-","4@10^-");
-      (void) SubstituteString(&fx_info->expression,"5e-","5@10^-");
-      (void) SubstituteString(&fx_info->expression,"6e-","6@10^-");
-      (void) SubstituteString(&fx_info->expression,"7e-","7@10^-");
-      (void) SubstituteString(&fx_info->expression,"8e-","8@10^-");
-      (void) SubstituteString(&fx_info->expression,"9e-","9@10^-");
+      (void) SubstituteString(&fx_info->expression,"0e+","0**10^");
+      (void) SubstituteString(&fx_info->expression,"1e+","1**10^");
+      (void) SubstituteString(&fx_info->expression,"2e+","2**10^");
+      (void) SubstituteString(&fx_info->expression,"3e+","3**10^");
+      (void) SubstituteString(&fx_info->expression,"4e+","4**10^");
+      (void) SubstituteString(&fx_info->expression,"5e+","5**10^");
+      (void) SubstituteString(&fx_info->expression,"6e+","6**10^");
+      (void) SubstituteString(&fx_info->expression,"7e+","7**10^");
+      (void) SubstituteString(&fx_info->expression,"8e+","8**10^");
+      (void) SubstituteString(&fx_info->expression,"9e+","9**10^");
+      (void) SubstituteString(&fx_info->expression,"0e-","0**10^-");
+      (void) SubstituteString(&fx_info->expression,"1e-","1**10^-");
+      (void) SubstituteString(&fx_info->expression,"2e-","2**10^-");
+      (void) SubstituteString(&fx_info->expression,"3e-","3**10^-");
+      (void) SubstituteString(&fx_info->expression,"4e-","4**10^-");
+      (void) SubstituteString(&fx_info->expression,"5e-","5**10^-");
+      (void) SubstituteString(&fx_info->expression,"6e-","6**10^-");
+      (void) SubstituteString(&fx_info->expression,"7e-","7**10^-");
+      (void) SubstituteString(&fx_info->expression,"8e-","8**10^-");
+      (void) SubstituteString(&fx_info->expression,"9e-","9**10^-");
     }
   /*
     Convert complex to simple operators.
@@ -234,6 +234,8 @@
   (void) SubstituteString(&fx_info->expression,"&&",fx_op);
   *fx_op=(char) LogicalOrOperator;
   (void) SubstituteString(&fx_info->expression,"||",fx_op);
+  *fx_op=(char) ExponentialNotation;
+  (void) SubstituteString(&fx_info->expression,"**",fx_op);
   return(fx_info);
 }
 
@@ -1852,6 +1854,7 @@
     NullPrecedence,
     BitwiseComplementPrecedence,
     ExponentPrecedence,
+    ExponentialNotationPrecedence,
     MultiplyPrecedence,
     AdditionPrecedence,
     ShiftPrecedence,
@@ -2011,6 +2014,11 @@
           precedence=LogicalOrPrecedence;
           break;
         }
+        case ExponentialNotation:
+        {
+          precedence=ExponentialNotationPrecedence;
+          break;
+        }
         case ':':
         case '?':
         {
@@ -2116,7 +2124,7 @@
           return(*beta);
         }
         case '*':
-        case '@':
+        case ExponentialNotation:
         {
           *beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,beta,exception);
           return(alpha*(*beta));