[m-users.] Too Slow
Peter Wang
novalazy at gmail.com
Tue May 12 17:56:24 AEST 2015
Hi,
On Mon, 11 May 2015 18:19:46 +0100, matthias.guedemann at googlemail.com (Matthias Güdemann) wrote:
>
> ok, I chose the lazy solution to convert to string and then use
> from_string to get the correct value. But isn't this a problem in int.m,
> too?
>
> ,----
> | abs(Num, Abs) :-
> | ( Num < 0 ->
> | Abs = 0 - Num
> | ;
> | Abs = Num
> | ).
> `----
Right. int.m says "The behaviour of a computation for which overflow
occurs is undefined." abs(min_int) silently returns a negative value
for you; on another system it can (and does) crash instead.
If int.m checked for overflow then abs(min_int) would throw an
exception, so you still need to avoid it.
This definition of mp_int does not convert to string:
mp_int(N) = Res :-
( N < 0 ->
( N = min_int ->
% Avoid `-min_int' as it overflows.
mp_init(-(min_int + 1), M),
Res = -(M + one)
;
mp_init(-N, M),
Res = -M
)
;
mp_init(N, Res)
).
mp_init/3 still has a call to mp_set_int that should be
mp_set_long_long.
Peter
More information about the users
mailing list