pike.git/
src/
operators.c
Branch:
Tag:
Non-build tags
All tags
No tags
2011-04-09
2011-04-09 11:04:41 by Henrik Grubbström (Grubba) <grubba@grubba.org>
5c22db555c8ea75941f6e5bb7cda6fc2da93acb0 (
28
lines) (+
26
/-
2
)
[
Show
|
Annotate
]
Branch:
7.9
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++)