Deutsch
Forum

Quadratwurzel ohne Begrenzung

 

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?
 
15.08.2008  
 




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:
declare a!
decimals 35
a!=.333333333333333
print a!
waitinput
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:  [...] 
 
15.08.2008  
 




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) ?
 
19.08.2008  
 



wm_copyData könnte Dir hier helfen.
 
19.08.2008  
 




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!
 
19.08.2008  
 



Klar, xprofan.com suche und google sind die Helfer in solcher Not!
 
19.08.2008  
 




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

 
06.09.2008  
 



Der Zweite Parameter von Mid$ muss mindestens 1 sein wenn man tatsächlich ab erster Position ermitteln möchte.
 
06.09.2008  
 




Stefan
Landsberg
ahhh,
danke (warum bin ich da nicht selbst drauf gekommen )
 
06.09.2008  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

10.362 Betrachtungen

Unbenanntvor 0 min.
Sebastian Sprenger13.10.2013
Andreas Koch20.12.2011

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie