Re: Missing in misc.e
I'll start benchmarking later today hopefully, but here is a new version of the
min/max part of say math.e, taking into account some of the earlier discussion:
global constant FB_MIN = 0,
FB_MAX = 8,
FB_INDEX = 1,
FB_VALUE = 2,
FB_PAIR = 4
constant M_CRASH_MESSAGE = 37,
FB_ALT_MIN=1,
FB_ALT_MAX=-1
integer find_max, starting_point,return_mode
sequence fb_seq
function find_bound()
object min_or_max,y
if starting_point > length(fb_seq) or starting_point < 1 then
machine_proc(M_CRASH_MESSAGE,
"math.e: Cannot find bounds of an empty sequence.")
?1/0 -- force run time error
end if
min_or_max=fb_seq[starting_point]
for i=starting_point+1 to length(fb_seq) do
y=fb_seq[i]
if compare(min_or_max,y)=find_max then
min_or_max=y
starting_point=i
end if
end for
if and_bits(return_mode, FB_PAIR) then
if and_bits(return_mode,FB_INDEX) then
return {starting_point,min_or_max}
else
return {min_or_max,starting_point}
end if
elsif and_bits(return_mode,FB_INDEX) then
return starting_point
else
return min_or_max
end if
end function
global function find_min(sequence s,integer start)
find_bound_mode=FB_ALT_MIN
return_mode=FB_INDEX
fb_seq = s
starting_point = start
return find_bound()
end function
global function find_max(sequence s,integer start)
find_max=FB_ALT_MAX
return_mode=FB_INDEX
starting_point = start
fb_seq = s
return find_bound()
end function
global function get_min(sequence s,integer start)
find_alt_max = FB_ALT_MIN
return_mode=FB_VALUE
starting_point = start
fb_seq = s
return find_bound()
end function
global function get_max(sequence s,integer start)
find_bound_mode=FB_ALT_MAX
return_mode=FB_VALUE
starting_point = start
fb_seq = s
return find_bound()
end function
global function find_sequence_bounds(sequence s,integer start,integer mode)
return_mode=and_bits(mode,FB_INDEX+FB_VALUE+FB_PAIR)
if not return_mode then
machine_proc(M_CRASH_MESSAGE,
"math.e: find_sequence_bounds() doesn not know what to return.")
?1/0
end if
if and_bits(mode,FB_MAX) then
find_bound_mode=FB_ALT_MAX
else
find_bound_mode=FB_ALT_MIN
end if
starting_point = start
fb_seq=s
return find_bound()
end function
function min(object x,object y)
if compare(x,y)=-1 then
return x
else
return y
end if
end function
function max(object x,object y)
if compare(x,y)=1 then
return x
else
return y
end if
end function
The basic idea is that you can have speed by using canned forms, or flexibility
using the general form, but not both at the same time. And it is not fair to
force a specific choice on the coder or the user.
I don't like the double test on return from find_bounds(), I'll see if I can
optimise it - or if it just doesn't matter anyway. After all, it's the only place
there's always a test, so it may be acceptable.
CChris
|
Not Categorized, Please Help
|
|