Sqrt - Wurzel ohne Längenbegrenzung ziehen

  • Hi,
    Ich wollt mal etwas fragen :
    1. Wo ist der Befehl "Sqrt" definiert ? Also welches include
    2. Wie kann ich den Ausgabewert einer Wurzel auf unbestimmte Länge erweitern ?

    Im Moment werden nur ca. 15 Stellen nach dem Komma angezeigt. Ich würde gerne unendlich viele anzeigen lassen ,bis man durch einen Hotkey Befehl diese Berechnungen abbricht und den bis dahin errechneten Wert wiedergibt. Ich habe 0 Plan deswegen frag ich mal einfach ;)

  • Zu 1.:
    Der Befehl Sqrt ist in keinem Include deffiniert, da er eine standart Funktion von AutoIt ist.
    Zu 2.:
    Das kürzen der Kommastellen wäre kein Problem, aber das erweitern schon.
    Du müsstest du dir schon eine eigene Funktion schreiben.

    MfG,
    H2112.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Die säh dann GANZ GROB so aus:

    Spoiler anzeigen
    [autoit]

    $ergebnis = 0
    $testzahl = 0
    $zaehler = 0
    $multiplikator = 100
    $nachkommastellen = inputbox("Nachkommastellen", "Anzahl der Nachkommastellen")
    $berechnezahl = inputbox("Wurzel von", "Wurzel berechnen von:")
    while $zaehler <= $nachkommastellen+2
    while ($ergebnis + ($multiplikator*$testzahl))^2 <= $berechnezahl
    $testzahl += 1
    WEnd
    $testzahl -= 1
    $ergebnis += $multiplikator*($testzahl)
    $multiplikator = $multiplikator *(1/10)
    $zaehler += 1
    WEnd
    MsgBox(0, "Ergebnis", "Das Ergebnis der Wurzel ist: "&$ergebnis)
    Exit

    [/autoit]
  • Hi,
    AutoIt HAT eine Wurzel-Funktion ;)
    Versuche es einfach mit der Exponentiation!
    (Eine Wurzel ist nix anderes als Zahl hoch 1/2)

    [autoit]


    ;<AutoItScript>
    $a=4
    $Sqrt=$a^(0.5)
    MsgBox(0, 'Ergebnis', 'Wurzel aus ' &$a &'=' &$Sqrt)
    ;</AutoItScript

    [/autoit]


    Eine 'höhere Genauigkeit' mit AutoIt zu erzielen, wäre nicht sinnvoll, da die Zahl bei Berechnungen auf den AutoIt-Bereich reduziert wird(Das ist in anderen Sprachen aber genauso..)
    Wenn es dir darum geht, den Algorithmus in AutoIt zu schreiben:-->schöne Übungsaufgabe, viel Spaß
    Wenn es dir um das genaue Ergebnis geht: nimm Mathe-Software(ich kenne Derive von ti, das kann Pi auf 2000 und mehr Stellen berechnen. Bei Maxima o.ä. habe ich das noch nicht probiert..)
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

    2 Mal editiert, zuletzt von ytwinky (8. November 2010 um 17:41)

  • Hi,
    AutoIt HAT eine Wurzel-Funktion ;-))

    Das hat doch hier niemand angezweifelt? 8|

    Das Problem bei deiner Version ist, dass wieder nur 15 Nachkommastellen angezeigt werden, und genau das ist das Hauptproblem.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Hi,
    mit der BigNum.au3 habe ich noch keine Experimente gemacht, aber das ist ein guter Tipp, thx
    Dafür habe ich ihn gleich mal in das Skript eingebaut, da lassen sich die Änderungen dann sehen:

    Spoiler anzeigen
    [autoit]


    #NoTrayIcon
    #include <Constants.au3>;Hier sind $IDYes usw. deklariert..
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include 'BigNum.au3'

    [/autoit] [autoit][/autoit] [autoit]

    ;<AutoItScript>
    Opt('MustDeclareVars', 0) ;0=ohne, 1=erfordert Variablen-Deklaration
    Const $ScriptType='GUI' ; Steht hier Console oder nur c erkennt Msg() daß es ein CUI.Programm ist..
    ;+----------------------------------------------------------------------------+
    ;| Header: Bestimmen der Übergabeparameter |
    ;| ( Alles Strings(!!!), bis auf $ArgC ) |
    ;| FontAnzeigeCheck: |Il1 sind Alt-0124, Großes i, Kleines L, Eins |
    Const $Autor='Sqrt-Näherung.au3 ©2010 by ytwinky, MD'; |
    ;| EMail: [email='PIII1kSystem-AutoIt3Forum@yahoo.de'][/email] |
    ;| AutoIt3-Version: 3.3.6.1, Beta: -.-.-.- |
    ;| Editor: SciTE 1.79d, feste Schriftart |
    ;| Zweck : Schablone für den Anfang, nach Bedarf anpassen |
    ;| Tab auf 2 setzen wg. Lesbarkeit |
    ;+----------------------------------------------------------------------------+
    #Region ### START Koda GUI section ### Form=D:\Sprachen\AutoIt3\Au3\kxf\WurzelBerechnung.kxf
    $WurzelBerechnung = GUICreate("WurzelBerechnung", 370, 195, 302, 218)
    $grpMain = GUICtrlCreateGroup("", 0, 0, 369, 193)
    $efRadikand = GUICtrlCreateInput("", 10, 76, 121, 21)
    $efSchritte = GUICtrlCreateInput("", 154, 76, 53, 21)
    $Label1 = GUICtrlCreateLabel("Radikand eintragen", 12, 58, 115, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    GUICtrlSetTip(-1, "das ist die Zahl deren Wurzel berechnet werden soll")
    $Label2 = GUICtrlCreateLabel("Wurzel-Berechnung mit BigNum", 8, 16, 359, 33)
    GUICtrlSetFont(-1, 17, 800, 0, "Arial")
    GUICtrlSetColor(-1, 0x000080)
    GUICtrlSetTip(-1, "©2010 by ytwinky, MD")
    $Label3 = GUICtrlCreateLabel("Schritte", 154, 58, 48, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $Label4 = GUICtrlCreateLabel("Wurzel(Sqrt)", 8, 102, 74, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $efWurzel = GUICtrlCreateInput("", 4, 120, 361, 21)
    $btnQuit = GUICtrlCreateButton("Quit", 290, 164, 75, 25, $WS_GROUP)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $efSqrt = GUICtrlCreateInput("", 6, 141, 361, 21, $ES_READONLY, 0)
    $btnCompute = GUICtrlCreateButton("Berechnen", 4, 164, 75, 25, $WS_GROUP)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1

    [/autoit] [autoit][/autoit] [autoit]

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE, $btnQuit
    Exit
    Case $efSchritte
    GuiCtrlSetData($efWurzel, '')
    GuiCtrlSetData($efSqrt, '')
    Case $efRadikand
    GuiCtrlSetData($efWurzel, '')
    GuiCtrlSetData($efSqrt, '')
    Case $btnCompute
    $r=GuiCtrlRead($efRadikand)
    $s=GuiCtrlRead($efSchritte)
    If $r=0 Then
    GuiCtrlSetData($efWurzel, '0')
    GuiCtrlSetData($efSqrt, '0')
    Else
    GuiCtrlSetData($efSqrt, Sqrt($r))
    GuiCtrlSetData($efWurzel, Wurzel($r, $s))
    EndIf
    EndSwitch
    WEnd
    ;<AutoItFunctions>

    [/autoit] [autoit][/autoit] [autoit]

    Func Msg($What, $Title=$Autor, $Icons=0, $ErrLevel=0)
    Local $RetWert
    Switch StringLower($ScriptType)
    Case 'c', 'console', 'cui'
    ConsoleWrite($Title &@CrLf &$What)
    $RetWert=0
    Case Else
    $RetWert=MsgBox($Icons, $Title, $What)
    EndSwitch
    If $ErrLevel Then Exit $ErrLevel
    Return $RetWert
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Wurzel($Radikand, $Schritte)
    Return _BigNum_SQRT($Radikand, $Schritte)
    EndFunc
    ;~ x_0 = 2
    ;~ x_1 = (2+(x_0)^2)/(2*(x_0)) = 3/2
    ;~ x_2 = (2+(x_1)^2)/(2*(x_1)) = 17/12
    ;~ x_3 = (2+(x_2)^2)/(2*(x_2)) = 577/408
    ;~ x_4 = (2+(x_3)^2)/(2*(x_3)) = 1.414213562
    ;das war ein 'Algorithmus' aus dem Netz..
    ;</AutoItScript>

    [/autoit]


    Sorry, jetzt habe ich vergessen, wie ein Spoiler gesetzt wird..
    (vllt. könnte einer von den Mods mal, thx..)
    Gruß
    ytwinky

    Edit Oscar: Spoiler gesetzt.
    Danke, Oscar
    so ähnlich hatte ich das auch gemacht, allerdings war[/spoiler] in einer Extra-Zeile

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

    3 Mal editiert, zuletzt von ytwinky (8. November 2010 um 23:09)

  • sehr n1ce hab auch noch irgendwo ne nette udf muss ma gucken hoffentlich gibt es die noch :D der Ordner war mal knapp 700mb groß

  • Im Anhang findest du mal ne DLL von mir, die ich schnell Programmiert habe.
    Mit C++ ist es halt doch schneller ;)
    Aufruf mit:

    [autoit]


    ;double wurzel(double zahl, int stellen = 2)
    ;Rückgabe ist ein Double,
    ;Parameter 1 ist die Zahl, die "Gewurzelt" werden soll,
    ;Parameter 2 ist die Gewünschte anzahl an Nachkommastellen (Optional, Standart 2)
    ;Funktioniert nur bei x86
    $wurzel = DllCall("wurzel.dll","double:cdecl","wurzel","double",10, "int", 12)
    msgbox(0, "", $wurzel[0])

    [/autoit]


    Habe mal einen kleinen Speedtest von der Dll und folgender Funktion gemacht:

    [autoit]

    Func wurzel2($anzahl)
    $zahl = 10
    $testzahl = 1;
    $teilen = 1;
    $ergebnis = 0;
    for $i = 1 to $anzahl+1
    $testzahl = 1;
    while quadrat($ergebnis + ($testzahl / $teilen)) <= $zahl
    $testzahl += 1
    Wend
    $testzahl -= 1
    $ergebnis += ($testzahl / $teilen)
    $teilen *= 10;
    Next
    return $ergebnis;
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func quadrat($zahl)
    return $zahl * $zahl
    EndFunc

    [/autoit]

    Die Dll schlägt den Autoit-Code.
    Bei einer bis 30 NAchkommastellen hat die Dll bei 10 versuchen eine dauer von 1-2 MS, die funktion 2-3.
    Fals die DLL zuvor mit DLLOpen geöffnet wurde, beträgt ihre dauer sogar nur zwischen 0,02 und 0,06 Millisekunden.