Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Übersetzer gesucht! (C->FreeBasic)

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 03.05.2006, 08:11    Titel: Übersetzer gesucht! (C->FreeBasic) Antworten mit Zitat

Moin,

ich brauch wiedermal hilfe. Kann mir bitte iner helfen diesen C-Code (oder Fortran? Tippe aus C...) zu übersetzen nach Basic? Wäre mir echt wichtig.
Ich kann das nämlich gar nicht. Selbst ich kann C nicht mit verlegen und Löffel gegessen lachen

Vielen Dank schon im Vorraus!
Code:

/*  This program employs the recently discovered digit extraction scheme
    to produce hex digits of pi.  This code is valid up to ic = 2^24 on
    systems with IEEE arithmetic. */

/*  David H. Bailey     2000-03-28 */

#include <stdio.h>
#include <math.h>

main()
{
  double pid, s1, s2, s3, s4;
  double series (int m, int n);
  void ihex (double x, int m, char c[]);
  int ic = 1000000;
#define NHX 16
  char chx[NHX];

/*  ic is the hex digit start position. */

  s1 = series (1, ic - 1);
  s2 = series (4, ic - 1);
  s3 = series (5, ic - 1);
  s4 = series (6, ic - 1);
  pid = 4. * s1 - 2. * s2 - s3 - s4;
  pid = pid - (int) pid + 1.;
  ihex (pid, NHX, chx);
  printf (" start position = %i\n hex digits =  %10.10s\n", ic, chx);
}

void ihex (double x, int nhx, char chx[])

/*  This returns, in chx, the first nhx hex digits of the fraction of x. */

{
  int i;
  double y;
  char hx[] = "0123456789ABCDEF";

  y = fabs (x);

  for (i = 0; i < nhx; i++){
    y = 16. * (y - floor (y));
    chx[i] = hx[(int) y];
  }
}

double series (int m, int ic)

/*  This routine evaluates the series  sum_k 16^(ic-k)/(8*k+m)
    using the modular exponentiation technique. */

{
  int k;
  double ak, eps, p, s, t;
  double expm (double x, double y);
#define eps 1e-17

  s = 0.;

/*  Sum the series up to ic. */

  for (k = 0; k < ic; k++){
    ak = 8 * k + m;
    p = ic - k;
    t = expm (p, ak);
    s = s + t / ak;
    s = s - (int) s;
  }

/*  Compute a few terms where k >= ic. */

  for (k = ic; k <= ic + 100; k++){
    ak = 8 * k + m;
    t = pow (16., (double) (ic - k)) / ak;
    if (t < eps) break;
    s = s + t;
    s = s - (int) s;
  }
  return s;
}

double expm (double p, double ak)

/*  expm = 16^p mod ak.  This routine uses the left-to-right binary
    exponentiation scheme.  It is valid for  ak <= 2^24. */

{
  int i, j;
  double p1, pt, r;
#define ntp 25
  static double tp[ntp];
  static int tp1 = 0;

/*  If this is the first call to expm, fill the power of two table tp. */

  if (tp1 == 0) {
    tp1 = 1;
    tp[0] = 1.;

    for (i = 1; i < ntp; i++) tp[i] = 2. * tp[i-1];
  }

  if (ak == 1.) return 0.;

/*  Find the greatest power of two less than or equal to p. */

  for (i = 0; i < ntp; i++) if (tp[i] > p) break;

  pt = tp[i-1];
  p1 = p;
  r = 1.;

/*  Perform binary exponentiation algorithm modulo ak. */

  for (j = 1; j <= i; j++){
    if (p1 >= pt){
      r = 16. * r;
      r = r - (int) (r / ak) * ak;
      p1 = p1 - pt;
    }
    pt = 0.5 * pt;
    if (pt >= 1.){
      r = r * r;
      r = r - (int) (r / ak) * ak;
    }
  }

  return r;
}
verlegen

Zuletzt bearbeitet von psygate am 03.05.2006, 20:19, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 03.05.2006, 10:27    Titel: Antworten mit Zitat

Hi psygate,
ich schau mir den C-Code gerne mal an..
..entferne bitte in der letzten Zeile deines Posts das (code) vor dem (/code),
damit das als Code erkennbar ist..
() müssen durch [] ersetzt werden..
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 03.05.2006, 12:17    Titel: Antworten mit Zitat

Hi psygate,
so, jetzt muß sich ein C-Profi nur noch die Stellen mit 'Ooops ansehen..
Bei den anderen Zeilen bin ich mir(ziemlich) sicher, daß ich sie 'richtig'
umgewandelt habe.
Vllt. kannste mal erklären, was das Programm machen soll..
..ich habe beim Übersetzen nicht herausfinden können, was der Zweck ist.
Möglicherweise gibt es ja bereits Lösungen in FB, die besser sind,
da Unterprogramme in C nicht zwangsläufig die Spezialitäten von FB
berücksichtigen.
(Wenn es um Pi geht, sieh dir mal die Function von volta an..
Es macht imho nicht viel Sinn, Pi auf 50 Stellen zu berechnen, wenn die
anderen Variablen nur ~15 Stellen haben. Auf der anderen Seite würde das
Umformen aller Variablen auf 50 Stellen den Prozessor ganz schön fordern,
die Permormance nach unten ziehen und nicht zuletzt bedeuten, daß SÄMTLICHE
mathematischen Funktionen umgeschrieben werden müßten..)
Gruß
ytwinky
Code:
'/* This program employs the recently discovered digit extraction scheme
'to produce hex digits of pi. This code is valid up to ic = 2^24 on
'systems with IEEE arithmetic. */

'/* David H. Bailey 2000-03-28 */

'main()
Option Escape
Option Explicit
Declare Sub ihex(byVal x as Double, byVal nhx as Int, byRef chx As String)
Declare Function series(m As Int, ic As Int) As Double
Declare Function expm(p As Double, ak As Double) As Double

Const NHX=16
Const ic=1000000
Dim As Double pid, s1, s2, s3, s4
Dim chx(NHX)
Dim Shared tp(ntp) As Double
Dim Shared tp1 As Integer=0

'/* ic is the hex digit start position. */
s1=series(1, ic-1)
s2=series(4, ic-1)
s3=series(5, ic-1)
s4=series(6, ic-1)
pid=4.0*s1-2.0*s2-s3-s4
pid-=CInt(pid)+1.0 'Ooops..
ihex(pid, NHX, chx)
Print " start position = ";ic;"\n hex digits = ";chx;"\n" 'Ooops..
Sleep
End

Sub ihex(byVal x as Double, byVal nhx as Int, byRef chx As String)
'/* This returns, in chx, the first nhx hex digits of the fraction of x. */
  Const hx="0123456789ABCDEF"
  Dim i as Int, y As Double=Abs(x)
  For i=0 To nhx-1
    y=16.0*(y-CInt(y))
  Next
  Mid(chx, i, 1)=Mid(hx, y, 1)
End Sub

Function series(m As Int, ic As Int) As Double
'/* This routine evaluates the series sum_k 16^(ic-k)/(8*k+m)
'using the modular exponentiation technique. */
  Const eps=1e-17
  Dim k As Int
  Dim As Double ak, p, s=0.0, t
'  /* Sum the series up to ic. */
  For k=0 To ic-1
     ak=8*k+m
     p=ic-k
     t=expm(p, ak)
     s+=t/ak
     s-=Int(s) 'Ooops..
  Next
'/* Compute a few terms where k >= ic. */
  For k=ic To ic+100-1
    ak=8*k+m
    t=16.0^(ic - k) / ak 'Ooops..
    If t<eps Then Exit For
    s+=t
    s-=CInt(s) 'Ooops..
  Next
  Return s
End Function

Function expm(p As Double, ak As Double) As Double
'/* expm = 16^p mod ak. This routine uses the left-to-right binary
'exponentiation scheme. It is valid for ak <= 2^24. */
  Const ntp=25
  Dim As Int i, j
  Dim As Double p1, pt, r
'/* If this is the first call to expm, fill the power of two table tp. */
  If tp1=0 Then
    tp1=1
    tp(0)=1.0
  End If
  For i=1 To ntp-1
    tp(i)=2.0*tp(i-1)
  Next
  If ak=1.0 Then Return 0.0
'/* Find the greatest power of two less than or equal to p. */
  For i=0 To ntp-1
    If tp(i)>p Then Exit For
    pt=tp(i-1)
    p1=p
    r=1.0
'/* Perform binary exponentiation algorithm modulo ak. */
    For j=1 To i
      If p1>=pt Then
        r*=16.0
        r-=Int(r/ak)*ak 'Ooops..
        p1-=pt
      End If
      pt*=0.5
      If pt>=1.0 Then
        r*=r
        r-=Int(r/ak)*ak 'Ooops..
      End If
    Next
  Next
  Return r
End Function

_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 03.05.2006, 20:18    Titel: Antworten mit Zitat

Danke! Ich hoffe es funzt jetzt.

Das Programm berechnet bestimmte Stellen von pi. Baily-Borwein-Pouffle Formel (k.A. ob man die so schreibt!) Kopf schütteln

lachen lachen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 03.05.2006, 20:23    Titel: Antworten mit Zitat

haaallloooo,
psygate, der Hinweis mit dem 'Ooops und den C-Profis war durchaus kein Scherz, wenn das Programm so läuft, habe ich Glück gehabt..
..und du erstmal vor lachen auf dem Boden rollen
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 04.05.2006, 15:17    Titel: Antworten mit Zitat

Es tut mir leid das sagen zu müssen, weinen aber es geht nicht!

Es gibt mir immer wieder konflikte aus von wegen es wäre falsch dimensioniert usw...
Kopf schütteln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 04.05.2006, 16:40    Titel: Antworten mit Zitat

ytwinky hat Folgendes geschrieben:
psygate, der Hinweis mit dem 'Ooops und den C-Profis war durchaus kein Scherz, wenn das Programm so läuft, habe ich Glück gehabt..
..und du erstmal vor lachen auf dem Boden rollen
Hast mal npaar Daten?
Ich kann so mit dem Programm nix anfangen..
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 04.05.2006, 17:59    Titel: Antworten mit Zitat

Ich kann zwar kein C, aber das fällt mir auf:
Code:
  int ic = 1000000;
#define NHX 16
  char chx[NHX];


Code:
Const NHX=16
Const ic=1000000
Dim As Double pid, s1, s2, s3, s4
Dim chx(NHX)


Char ist doch der String von C?!
Damit wäre das Equvalent zu
Code:
char chx[NHX];

dass hier:
Code:
Dim chx as string*NHX

Wenn der Entwickler aber CHAR als Zahl missbraucht hat, wäre das Freebasic gegenstück Byte.

Und welche FB Version hast du?
Bei mir geht As Int nicht, ich muss As Integer schreiben.

Und was will der C Programmierer mit dem #define NHX 16 erreichen?
Ich bekomme die Meldung "Duplicated definiton".

Naja ....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 04.05.2006, 18:18    Titel: Antworten mit Zitat

Wie schon erwähnt. Dies ist ein programm von einem mathematiker.
Für nähere info schaut mal unter:

http://de.wikipedia.org/wiki/Bailey-Borwein-Plouffe-Formel
oder
http://crd.lbl.gov/~dhbailey/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 04.05.2006, 18:34    Titel: Antworten mit Zitat

Michael Frey hat Folgendes geschrieben:
Und welche FB Version hast du?
Bei mir geht As Int nicht, ich muss As Integer schreiben.
..wenn du mich meinst FB 0.15b
Und wenn du mich jetzt fragst:"Geht 'As Int' bei dir?" ist meine Antwort:
Selbstverständlich nicht, FBIde hat bei As Int das Int als Int dargestellt und so habe ich meinen Fehler einfach übersehen, sry
Im Klartext: 'As Int' ist falsch und muß durch 'As Integer' ersetzt werden
Außerdem muß die Const ntp..-Anweisung ins Hauptprogramm
..wie gesagt, das Programm muß sich ein C-Profi ansehen, da ich C ungefähr so beherrsche wie Schach..
..ich kann die Grundzüge
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 04.05.2006, 22:47    Titel: Antworten mit Zitat

Michael Frey hat Folgendes geschrieben:
Char ist doch der String von C?!

Jaein, Char direkt übersetzt ist UBYTE, ein Char-Array ist eben ein UByte Array was praktisch einem String entspricht aber keiner sein muss, kann auch einfach ne bestimmte menge an gespeicherten bytes sein. Die Integerdeklaration ist aber auf jeden fall falsch, entweder chx AS STRING*NHX oder chx(NHX) AS UBYTE, in anbetracht des weiteren codes ( Mid(chx, i, 1)=Mid(hx, y, 1) ) würd ich aber auf die stringvariante tippen.
Ist bei dem Mid eigentlich die Verschiebung um einen Index beachtet? C zählt von 0 bis LEN()-1, FreeBASIC indiziert Strings aber von 1 bis LEN(), die FOR-Schleife geht von 0 bis nhx-1 also würd ich sagen da müsste da noch ein +1 dazu ( mid(chx,i+1,1) ) oder man benutzt einfach auch chx[i] was in FB auch geht und einfacher ist als mid mit länge 1.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 07.05.2006, 20:35    Titel: Antworten mit Zitat

HEY! lasst bitte mein thema nicht sterben! Ich brauche dringend hilfe dabei!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz