| |
|
|
Stefan Landsberg | Hallo,
ich möchte ein Programm schreiben, dass die Quadratwurzel einer Zahl berechnet. ABER es soll nicht auf 6 Nachkommastellen runden, sondern solange weitermachen bis man auf Stop klickt.
Frage: (wie) kann man das Kürzen auf 6 Nachkommastellen bei sqrt() und pow() abstellen.
Wenn das nicht geht, dann muss ich mir irgend eine Prozedur einfallen lassen die dass macht. Aber bitte keine Fertiglösung posten. Dann lerne ich nichts.
Noch eine Frage: ist in XProfan 10 die länge eines floats begrenzt? |
|
|
| |
|
|
|
Sebastian Sprenger | Hallo Stefan,
Frage 1:
Die Funktionen Sqrt() and Pow() runden gar nichts. Die Zahlen werden einfach nur zu kurz angezeigt. Es gibt da einen Befehl namens Decimals . Mit dem kannst du bestimmen, wieviele Nachkommastellen angezeigt werden sollen (an dieser Stelle verweise ich dich mal auf die XProfan-Hilfe ).
Frage 2:
Floats können im Prinzip unendlich lang sein, nur die sog. "Rechengenauigkeit" ist auf 15 Stellen begrenzt. Mit anderen Worten: Wenn du eine Zahl hast, die über 15 Ziffern lang ist (egal ob Nachkommastellen oder keine), kann es passieren, dass Rechnungen oder Ergebnisse ab der 16. Stelle ungenau werden.
Ich geb dir mal ein kleines Beispiel: Bei mir kommt 0.33333333333333298 mit etlichen Nullen raus. Die ersten 15 Ziffern stimmen also, ab der 16. Stelle stimmt nicht viel.
So, genug gelernt? Gruß, Sebastian |
|
|
| Profan² 7.0e, XProfan 9, 11.2a, FreeProfan32 Windows Vista Home Premium 32-Bit, 2.8 Ghz, 4 GB RAM Windows Me, 1.8 Ghz, 256 MB RAM | 15.08.2008 ▲ |
|
|
|
|
Jac de Lad |
Floats können im Prinzip unendlich lang sein, Das stimmt nicht...
nur die sog. "Rechengenauigkeit" ist auf 15 Stellen begrenzt. ...und damit ist ein Float NIEMALS unendlich lang. Außerdem ist nur ein bestimmter Bereich erlaubt (ich glaube das kleinste ist 1*10^-43xx oder so). Kleiner Zahlen werden dann auch nicht akzeptiert.
Es gibt Algorithmen, mit denen du die Wurzel immer weiter berechnen lassen kannst. Willst du nur die 2. Wurzel oder soll jede beliebige n-te Wurzel berechenbar sein? Ich könnte mal schauen, ob ich was da habe...
Jac |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 15.08.2008 ▲ |
|
|
|
|
Stefan Landsberg | ich hab jetz auch schon ein bisschen rumprobiert. irgendwie komm ich nicht so richtig voran weil mein programm nicht macht was ich will.
@sebastian: danke für die schnelle antwort. aber bei mir kann ich mit decimals aber auch nur bis 35 gehen. mehr nachkommastellen werden nicht angezeigt.
wenn float nur bis zur 15ten stelle genau ist ist es in diesem fall nutzlos für mich.
@Jac Ich möchte erstmal nur die 2. also die Quadratwurzel berechnen. (wir haben das thema grad in der Schule, deshlab komme ich auch auf die Idee für so ein Programm). Ich habe auch schon daran gedacht etwas zu schreiben was eine Stelle nach der anderen berechnet. Das wäre nämlich genau das was ich haben wollte. Ich weiß nur noch nicht wo ich anfangen soll.
Wäre es zu viel verlangt wenn du (falls du so einen Algorithmus hast) nicht den ganzen Code postest sondern nur Tipps gibts mit welchen Befehlen das zu realisieren ist und den groben aufbau beschreibst? Sonst ist das Programm ja nicht von mir
@all ich habe als ausgabefeld für das ergebnis ein multiedit genommen. ist das für die ausgabe von zahlen geeignet oder gibt es was besseres?
ach ja. so sieht das aus was ich zur zeit habe. es wird aber gar nichts gerechnet. sondern nur die zahl aus dem eingabefeld übernommen: [...] |
|
|
| |
|
|
|
Jac de Lad | Nein, nein, nein! Typischer Anfängerfehler. Um mit den Eingaben zu rechnen musst du es erst von String in ein Float umwandeln (siehe "Val()") und zur Ausgabe im MultiEdit wieder in einen String (siehe "Str$()").
Declare
declare in&,out&,btn&,ergebnis$,ende%,eingabe$
Fenster erstellen
windowstyle 575
windowtitle "Quadratwurzel"
window 20,20 - 600,400
usefont "MS Sans Serif",20,0,0,0,0
Fenster gestalten
in&=create("edit",%hWnd,"25",5,5,580,20)
btn&=create("button",%hWnd,"Berechnen",250,30,100,30)
out&=create("multiedit",%hWnd,"",5,65,580,-270)
whilenot ende%
WaitInput
case %key=2 : break
if clicked(btn&)
eingabe$=gettext$(in&)
ergebnis$=Str$(sqrt(Val(eingabe$)))
settext out&,""
settext out&,ergebnis$
endif
endwhile
Kürzer wäre dein Prog so:
Declare
declare in&,out&,btn&,ende%
Fenster erstellen
windowstyle 575
windowtitle "Quadratwurzel"
window 20,20 - 600,400
usefont "MS Sans Serif",20,0,0,0,0
Fenster gestalten
in&=create("edit",%hWnd,"25",5,5,580,20)
btn&=create("button",%hWnd,"Berechnen",250,30,100,30)
out&=create("multiedit",%hWnd,"",5,65,580,-270)
whilenot ende%
WaitInput
if %key=2
break
elseif clicked(btn&)
settext out&,Str$(sqrt(Val(gettext$(in&))))
endif
endwhile
Zum Thema Berechnung:
Du kannst entweder jede Stelle einzeln berechnen lassen oder eine Zahl quadrieren und je nachdem ob sie zu groß oder zu klein ist immer ein wenig erhöhen oder abziehen. Dazu musst du die Zahlen in Strings speichern und jede Stelle einzeln multiplizieren.
Jac |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 15.08.2008 ▲ |
|
|
|
|
Stefan Landsberg | Hallo,
ich nehme für die ausgabe des ergebnisses ein einfaches editfeld, aber da ich in meinem Programm ja an die vorhandene zahl immer die neu berechnete stelle dranhängen will, ist es meiner meinung nach unpraktisch und wahrscheinlich auch zu langsam immer erst den aktuellen text mit gettext aus dem editfeld auszulesen, eine neu ziffer dranzuhängen, und dann wieder die zahl mit settext ins editfeld zu schreiben. gibts da eine bessere methode oder irgendeine message (gibts eine seite/datei in der die messages auf deutsch erklärt sind) ? |
|
|
| |
|
|
|
| wm_copyData könnte Dir hier helfen. |
|
|
| |
|
|
|
Stefan Landsberg | hallo, danke erstmal aber gibt es irgendwo ne dokumentation in der die messages verständlich (am besten deutsch) erklärt sind? ich blick bei msdn nicht so richtig durch! |
|
|
| |
|
|
|
| Klar, xprofan.com suche und google sind die Helfer in solcher Not! |
|
|
| |
|
|
|
Stefan Landsberg | nachdem ich jetz endlich wieder ein wenig zeit für xprofan gefunden hab (schule beansprucht ne ganze menge zeit. vor allem latein ) stelle ich mal wieder eine frage:
warum wir in der if abfrage keine wert an die variable firstpart$ übergeben? ich hab auch schon versucht sie als integer zu declarieren. geht auch nicht:
Declare
declare in&,out&,calcbtn&,stopbtn&,ergebnis$,ende%,eingabe$
PROC-Teil
Proc sqrtlong
Algorithmus zum ziehen einer Quadratwurzel
Parameters zahl$, output&, stopbtn&
declare vorkomma$, div2%, firstsqrt%, firstpart$
zahl$=translate$(zahl$, "," , ".") Dezimalkomma durch Dezimalpunkt ersetzen
vorkomma$=substr$(zahl$,1,".") Ziffern vor dem Komma in vorkomma$ speichern
div2%=Instr(".",str$(substr$(len(vorkomma$ / 2),1,"."))) Prüfen ob die Anzahl der Ziffern vor dem Komma gerade oder ungerade ist.
if div2% = 0
firstpart$=mid$(vorkomma$,0,2) erste 2 Ziffern aus vorkomma$ werden in firstpart$ gespeichert
firstsqrt%=substr$(str$(sqrt(val(firstpart$))), 1 , ".") es wird die sqrt aus firstpart$ gebildet (rest wird weggelassen)
else
firstpart$=mid$(vorkomma$,0,1) erste Ziffer aus vorkomma$ wird in firstpart$ gespeichert
firstsqrt%=substr$(str$(sqrt(val(firstpart$))), 1 , ".") es wird die sqrt aus firstpart$ gebildet (rest wird weggelassen)
endif
locate 4,1 nur zum testen was firstpart$ enhält
print "firstpart:",firstpart$ nur zum test was firstpart$ enhält
sendmessage(output&,$004A,%hWnd,Addr(firstsqrt%))
endproc
Fenster erstellen
windowstyle 575
windowtitle "Quadratwurzel"
window 20,20 - 600,125
usefont "MS Sans Serif",20,0,0,0,0
Fenster gestalten
in&=create("edit",%hWnd,"25,5",5,5,580,20)
calcbtn&=create("button",%hWnd,"Berechnen",170,30,100,30)
stopbtn&=create("button",%hWnd,"Stop",310,30,100,30)
out&=create("edit",%hWnd,"",5,65,580,20)
whilenot ende%
WaitInput
case %key=2 : break
if clicked(calcbtn&)
sqrtlong gettext$(in&), out&, stopbtn&
endif
endwhile
|
|
|
| |
|
|
|
| Der Zweite Parameter von Mid$ muss mindestens 1 sein wenn man tatsächlich ab erster Position ermitteln möchte. |
|
|
| |
|
|
|
Stefan Landsberg | ahhh, danke (warum bin ich da nicht selbst drauf gekommen ) |
|
|
| |
|
|