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