Programmiersprachen (Re: [linux-l] Ruby: sehr cool, aber laaaahm... wie geht's schneller?! - D?)
Oliver Bandel
oliver at first.in-berlin.de
So Aug 27 13:49:11 CEST 2006
On Sun, Aug 27, 2006 at 01:02:48PM +0200, Oliver Bandel wrote:
> Hi,
>
>
> On Sun, Aug 27, 2006 at 12:43:21PM +0200, Ivan F. Villanueva B. wrote:
> > Am Do, Aug 24, 2006 09:40:44 +0200, Axel Weiß schrieb:
> > > Oliver Bandel wrote:
> > > > Vorschläge in anderen Sprachen?
> > > > (Perl, Java, C, ...?!)
> > >
> > > Hier, 15 Minuten:
> > > --------------------------------
> > > [C code]
> >
> > Hier Java, 15 Minuten auch:
> > --------------------------
> [...]
>
> Hätte gedacht, es dauert in Java länger. ;-)
> Aber ich tippe auch nicht mit 10-Finger-System ;-)
>
Naja, die Zeit für die Aufgabenerstellung und das
Erst-Design braucht doch ganz schön.
Runter coden geht ja eh schneller...
Bei der Java-version merkt man aber schon, daß man da viel tippen muß,
auch im Vergleich zu der C-Version.
Man beachte bitte, wie umfangreich die jeweiligen Sourcen an Umfang zunehmen,
wenn die Anzahl der benutzten mathematischen Funktionen steigt.
In OCaml und C kann man das recht einfach bewerkstelligen.
(In C via Function Pointer (unschön, aber effektiv), in OCaml indem man
die Liste mit den Funktionen/Titeln erweitert.)
In Java hat man viel Deklarationstext zu tippen, scheint's mir.
Oder kann man das noch reduzieren?
Copy & Paste macht das Erstellen zwar einbfacher, aber es wird dennoch ungemein viel Code...
Hier nun eine überarbeitete OCaml-Version mit besserer Parametrisierung und
auch Argumentprüfung usw. (natürlich auch wieder mit Kommentaren :)):
==================================================================================
(* -------------------------------------------------------------------- *)
(* This function is for calculating the numerical derivation for a *)
(* function f with lower x-value at x and higher x-value at *)
(* x + epsilon. *)
(* -------------------------------------------------------------------- *)
let derive f x epsilon = ( f(x +. epsilon) -. f x ) /. epsilon
(* --------------------------------------------------------------- *)
(* This function calculates the derivative with an epsilon = 0.001 *)
(* --------------------------------------------------------------- *)
let myderive f x = derive f x 0.001
(* -------------------------------------------------------------------- *)
(* List of pair, where the pairs are of type ( float -> float, string ) *)
(* This will be feed into the calculating function. *)
(* -------------------------------------------------------------------- *)
let function_list_with_titel = [
(sin, "Sinus");
(cos, "Kosinus");
((fun x -> x *. x), "Quadrat (Parabel)");
((fun x -> x *. x *. x), "Kubik") ]
(* -------------------------------------------------------------------- *)
(* The calculation and printout will be done here. *)
(* This function needs the (function,title)-pair, the x_start and x_end *)
(* values and the number of intervalls (steps). *)
(* The true intervall-size will be calculated. *)
(* The printout always begins with the lowest x-value. *)
(* -------------------------------------------------------------------- *)
let calc_and_print_values fwt x_start x_end steps =
let sort_pair (x,y) = if x > y then (x,y) else (y,x) in
let func = fst fwt
and title = snd fwt
and (xe,xs) = sort_pair (x_start, x_end) in (* Achtung: xe soll > xs sein! :) *)
let truestep = (xe -. xs) /. float_of_int (abs steps) in
Printf.printf "\n\nBerechnung von %s:\n" title;
for index = 0 to steps
do
let x = xs +. (float_of_int index) *. truestep in
let y = func x in
let y' = myderive func x in
Printf.printf "x: %f, y: %f, y': %f\n" x y y'
done
let _ =
(* For the list of functions/titles do all the calculations *)
List.iter (fun pair -> calc_and_print_values pair 0.0 6.28 63) function_list_with_titel
==================================================================================
Gruß,
Oliver
Mehr Informationen über die Mailingliste linux-l