 |
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, 08: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, 20:19, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 03.05.2006, 10: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, 12: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, 20: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, 20: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, 15: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, 16: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, 17: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, 18: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, 22: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, 20: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.
|
|