Oops, use this one instead... "re"-fixes the exponent support...


*** tmp/parrot/src/string.c     Sat Mar  6 03:00:06 2004
--- parrot/src/string.c Wed Mar 17 16:05:50 2004
***************
*** 1836,1844 ****
          int exp_sign = 0;
          INTVAL in_exp = 0;
          INTVAL in_number = 0;
!         FLOATVAL exponent = 0;
          INTVAL fake_exponent = 0;
          INTVAL digit_family = 0;
  
          while (start < end) {
              UINTVAL c = s->encoding->decode(start);
--- 1836,1845 ----
          int exp_sign = 0;
          INTVAL in_exp = 0;
          INTVAL in_number = 0;
!         INTVAL exponent = 0;
          INTVAL fake_exponent = 0;
          INTVAL digit_family = 0;
+         FLOATVAL exp_log=10.0, exp_val=1.0;
  
          while (start < end) {
              UINTVAL c = s->encoding->decode(start);
***************
*** 1849,1855 ****
  
              if (df && df == digit_family) {
                  if (in_exp) {
!                     exponent = exponent * 10 + s->type->get_digit(s->type,c);
                      if (!exp_sign) {
                          exp_sign = 1;
                      }
--- 1850,1856 ----
  
              if (df && df == digit_family) {
                  if (in_exp) {
!                     exponent = exponent*10 + s->type->get_digit(s->type,c);
                      if (!exp_sign) {
                          exp_sign = 1;
                      }
***************
*** 1906,1912 ****
  
          exponent = fake_exponent + exponent * exp_sign;
  
!         f = f * sign * pow(10.0, exponent);     /* ugly, oh yeah */
      }
  
      return f;
--- 1907,1936 ----
  
          exponent = fake_exponent + exponent * exp_sign;
  
!         if(exponent < 0) {
!             exponent = -exponent; 
!             exp_sign=-1;
!         }
! 
!         for (;;) {
!             if (exponent & 1) {
!                 exp_val *= exp_log;
!                 exponent--;
!             }
!             if (!exponent)
!                 break;
!             exp_log *= exp_log;
!             exponent >>= 1;
!         }
!         
!         if(exp_sign < 0)
!             f /= exp_val;
!         else
!             f *= exp_val;
! 
!         
!         if(sign < 0)
!             f = -f;
      }
  
      return f;

Reply via email to