Branch: Tag:

2011-04-09

2011-04-09 11:04:41 by Henrik Grubbström (Grubba) <grubba@grubba.org>

f_minus(): Improved precision somewhat.

2465:    for(e=-args;e<0;e++) types|=1<<sp[e].type;       if ((types | BIT_INT | BIT_FLOAT) == (BIT_INT | BIT_FLOAT)) { -  /* Take advantage of the precision control in f_add(). */ +  INT32 carry = 0; +  if (types == BIT_INT) {    f_add(args-1);    o_subtract();    break;    } -  +  /* Take advantage of the precision control in f_add(). */ +  for(e = 1; e < args; e++) { +  if (s[e].type == PIKE_T_INT) { +  INT_TYPE val = s[e].u.integer; +  if (val >= -0x7fffffff) { +  s[e].u.integer = -val; +  } else { +  /* Protect against negative overflow. */ +  s[e].u.integer = ~val; +  carry++; +  } +  } else { +  s[e].u.float_number = -s[e].u.float_number; +  } +  } +  if (carry) { +  push_int(carry); +  args++; +  } +  f_add(args); +  break; +  }       push_svalue(s);    for(e=1;e<args;e++)