diff -r --unified libxml2-2.7.3.orig/xpath.c libxml2-2.7.3/xpath.c
--- libxml2-2.7.3.orig/xpath.c	2009-06-23 08:28:51.000000000 -0400
+++ libxml2-2.7.3/xpath.c	2009-06-23 08:29:01.000000000 -0400
@@ -9897,22 +9897,6 @@
     return(xmlStrndup(buf, len));
 }
 
-#define MAX_FRAC 20
-
-/*
- * These are used as divisors for the fractional part of a number.
- * Since the table includes 1.0 (representing '0' fractional digits),
- * it must be dimensioned at MAX_FRAC+1 (bug 133921)
- */
-static double my_pow10[MAX_FRAC+1] = {
-    1.0, 10.0, 100.0, 1000.0, 10000.0,
-    100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0,
-    10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0,
-    100000000000000.0,
-    1000000000000000.0, 10000000000000000.0, 100000000000000000.0,
-    1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0
-};
-
 /**
  * xmlXPathStringEvalNumber:
  * @str:  A string to scan
@@ -9934,84 +9918,45 @@
     const xmlChar *cur = str;
     double ret;
     int ok = 0;
-    int isneg = 0;
-    int exponent = 0;
-    int is_exponent_negative = 0;
-#ifdef __GNUC__
-    unsigned long tmp = 0;
-    double temp;
-#endif
+
     if (cur == NULL) return(0);
     while (IS_BLANK_CH(*cur)) cur++;
     if ((*cur != '.') && ((*cur < '0') || (*cur > '9')) && (*cur != '-')) {
         return(xmlXPathNAN);
     }
     if (*cur == '-') {
-	isneg = 1;
 	cur++;
     }
 
-#ifdef __GNUC__
-    /*
-     * tmp/temp is a workaround against a gcc compiler bug
-     * http://veillard.com/gcc.bug
-     */
-    ret = 0;
     while ((*cur >= '0') && (*cur <= '9')) {
-	ret = ret * 10;
-	tmp = (*cur - '0');
 	ok = 1;
 	cur++;
-	temp = (double) tmp;
-	ret = ret + temp;
     }
-#else
-    ret = 0;
-    while ((*cur >= '0') && (*cur <= '9')) {
-	ret = ret * 10 + (*cur - '0');
-	ok = 1;
-	cur++;
-    }
-#endif
 
     if (*cur == '.') {
-	int v, frac = 0;
-	double fraction = 0;
-
         cur++;
 	if (((*cur < '0') || (*cur > '9')) && (!ok)) {
 	    return(xmlXPathNAN);
 	}
-	while (((*cur >= '0') && (*cur <= '9')) && (frac < MAX_FRAC)) {
-	    v = (*cur - '0');
-	    fraction = fraction * 10 + v;
-	    frac = frac + 1;
+	while (*cur >= '0' && *cur <= '9') {
 	    cur++;
 	}
-	fraction /= my_pow10[frac];
-	ret = ret + fraction;
-	while ((*cur >= '0') && (*cur <= '9'))
-	    cur++;
     }
     if ((*cur == 'e') || (*cur == 'E')) {
       cur++;
       if (*cur == '-') {
-	is_exponent_negative = 1;
 	cur++;
       } else if (*cur == '+') {
         cur++;
       }
       while ((*cur >= '0') && (*cur <= '9')) {
-	exponent = exponent * 10 + (*cur - '0');
 	cur++;
       }
     }
     while (IS_BLANK_CH(*cur)) cur++;
     if (*cur != 0) return(xmlXPathNAN);
-    if (isneg) ret = -ret;
-    if (is_exponent_negative) exponent = -exponent;
-    ret *= pow(10.0, (double)exponent);
-    return(ret);
+
+    return atof(str);
 }
 
 /**
@@ -10028,71 +9973,39 @@
 static void
 xmlXPathCompNumber(xmlXPathParserContextPtr ctxt)
 {
-    double ret = 0.0;
-    double mult = 1;
     int ok = 0;
-    int exponent = 0;
-    int is_exponent_negative = 0;
-#ifdef __GNUC__
-    unsigned long tmp = 0;
-    double temp;
-#endif
+    const xmlChar *start = CUR_PTR;
 
     CHECK_ERROR;
     if ((CUR != '.') && ((CUR < '0') || (CUR > '9'))) {
         XP_ERROR(XPATH_NUMBER_ERROR);
     }
-#ifdef __GNUC__
-    /*
-     * tmp/temp is a workaround against a gcc compiler bug
-     * http://veillard.com/gcc.bug
-     */
-    ret = 0;
-    while ((CUR >= '0') && (CUR <= '9')) {
-	ret = ret * 10;
-	tmp = (CUR - '0');
-        ok = 1;
-        NEXT;
-	temp = (double) tmp;
-	ret = ret + temp;
-    }
-#else
-    ret = 0;
     while ((CUR >= '0') && (CUR <= '9')) {
-	ret = ret * 10 + (CUR - '0');
 	ok = 1;
 	NEXT;
     }
-#endif
     if (CUR == '.') {
         NEXT;
         if (((CUR < '0') || (CUR > '9')) && (!ok)) {
             XP_ERROR(XPATH_NUMBER_ERROR);
         }
         while ((CUR >= '0') && (CUR <= '9')) {
-            mult /= 10;
-            ret = ret + (CUR - '0') * mult;
             NEXT;
         }
     }
     if ((CUR == 'e') || (CUR == 'E')) {
         NEXT;
         if (CUR == '-') {
-            is_exponent_negative = 1;
             NEXT;
         } else if (CUR == '+') {
 	    NEXT;
 	}
         while ((CUR >= '0') && (CUR <= '9')) {
-            exponent = exponent * 10 + (CUR - '0');
             NEXT;
         }
-        if (is_exponent_negative)
-            exponent = -exponent;
-        ret *= pow(10.0, (double) exponent);
     }
     PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_NUMBER, 0, 0,
-                   xmlXPathCacheNewFloat(ctxt->context, ret), NULL);
+                   xmlXPathCacheNewFloat(ctxt->context, atof(start)), NULL);
 }
 
 /**
