  | 
					
						Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!   
						
						
					 | 
				 
			 
			 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	 
	
	
		| Autor | 
		Nachricht | 
	 
	
		psygate
 
 
  Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
  | 
		
			
				 Verfasst am: 03.05.2006, 07:11    Titel: Übersetzer gesucht! (C->FreeBasic) | 
				     | 
			 
			
				
  | 
			 
			
				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   und Löffel gegessen  
 
 
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;
 
}
 
 | 	    
  Zuletzt bearbeitet von psygate am 03.05.2006, 19:19, insgesamt einmal bearbeitet | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ytwinky
 
  
  Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
  | 
		
			
				 Verfasst am: 03.05.2006, 09:27    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				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 | 
		 | 
	 
	
		  | 
	 
	
		ytwinky
 
  
  Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
  | 
		
			
				 Verfasst am: 03.05.2006, 11:17    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				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 | 
		 | 
	 
	
		  | 
	 
	
		psygate
 
 
  Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
  | 
		
			
				 Verfasst am: 03.05.2006, 19:18    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Danke! Ich hoffe es funzt jetzt.
 
 
Das Programm berechnet bestimmte Stellen von pi. Baily-Borwein-Pouffle Formel (k.A. ob man die so schreibt!)   
 
 
      | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ytwinky
 
  
  Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
  | 
		
			
				 Verfasst am: 03.05.2006, 19:23    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				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  
 
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 | 
		 | 
	 
	
		  | 
	 
	
		psygate
 
 
  Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
  | 
		
			
				 Verfasst am: 04.05.2006, 14:17    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Es tut mir leid das sagen zu müssen,   aber es geht nicht!
 
 
Es gibt mir immer wieder konflikte aus von wegen es wäre falsch dimensioniert usw...
 
   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ytwinky
 
  
  Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
  | 
		
			
				 Verfasst am: 04.05.2006, 15:40    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | 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  
 
 | 	  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 | 
		 | 
	 
	
		  | 
	 
	
		Michael Frey
 
  
  Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
  | 
		
			
				 Verfasst am: 04.05.2006, 16:59    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				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
 
 
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 | 
		 | 
	 
	
		  | 
	 
	
		psygate
 
 
  Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
  | 
		 | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ytwinky
 
  
  Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
  | 
		
			
				 Verfasst am: 04.05.2006, 17:34    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | 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 | 
		 | 
	 
	
		  | 
	 
	
		MisterD
 
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
  | 
		
			
				 Verfasst am: 04.05.2006, 21:47    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | 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 | 
		 | 
	 
	
		  | 
	 
	
		psygate
 
 
  Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
  | 
		
			
				 Verfasst am: 07.05.2006, 19:35    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				| HEY! lasst bitte mein thema nicht sterben! Ich brauche dringend hilfe dabei! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
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.
  | 
   
 
     |