- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 5 von 5

Thema: suche: wurzel aus 8 bytes (aus 64-bit zahl)

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.08.2004
    Ort
    bw-germany
    Alter
    46
    Beiträge
    272

    suche: wurzel aus 8 bytes (aus 64-bit zahl)

    Anzeige

    E-Bike
    subj.

    bis jetz habe ich nur das gefunden: http://elm-chan.org/docs/avrlib/sqrt32.txt
    ist aber aus 32 bit...


    hat da jemmand was ?

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    ich grübel etz schon ne ganze weile, wie man den üblicherweise verwendeten algorithmus (http://de.wikipedia.org/wiki/Babylonisches_Wurzelziehen) auf mehrere (8..) bytes anwendet.

    kannst du evtl abstriche in der genauigkeit machen? bzw. deine anwendung beschreiben?

    da es ganzzahlen sind, wirst du eine exakte lösung wohl eh nicht bekommen, und in jedem fall wirst du dich zwischen geschwindigkeit und genauigkeit entscheiden müssen.

    gruesse

    bist du mit twiggy ramirez verwandt @avatar?

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.08.2004
    Ort
    bw-germany
    Alter
    46
    Beiträge
    272
    also ...
    geschwind/genau - is ca 50/50 %
    es werden 4 bytes X-achse eingegeben, und 4 bytes Y-achse.
    µC (90S8515) soll dan abstand von "0" bis diesen koordinaten errechnen.
    also mit dem formel:
    WEG=sqr(x^2+y^2)

    es sind ganzzahlen.
    genauigkeit ... am besten ganz genau... auf/abgerundet auf ganze zahl.

    EDIT:
    hat jmnd code in C zur hand ?
    ich konnte dann compilieren und disassemblieren ... ob es sinn macht....

  4. #4
    Hallo,
    warum verwendest du nich den in der Wiki pedia beschriebenen algo? der iss doch nich schlecht. Um die genauigkeit zu steigern könntest du die ausgangs zahl a * 4 nehmen (2 mal register shiften oder auch mehr, soviel platz wie du halt hast) dann den algo anwenden, bis die lezte iteration das selbe ergebniss wieder erbracht hat, (oder einfach nach 10 mal abbrechen) denn wieder das register zurück shiften?
    Also probiert hab ichs nich, aber wenn man vorher auf die zahl genug drauf gibt, genug shiftet, denn sollte es doch auch einigermasen genau sein. oder nicht?


    wahlweise geht auch:
    ein register von null an hochzählen und jedesmal quadrieren und vergleichen, wenn dann das ergebniss das erstemal größer als die wurzelzuziehende zahl war haste die quadratwurzel im zähler-register stehen.

  5. #5
    Olso:

    ich hab jez nur nen Mega8 aber der assembler code würde in etwa folgendermaßen lauten (AVRStudio):

    Code:
    .include "m8def.inc"
    
    .org 0x0000
    
    .def Xx	  = R16
    .def count= R17
    .def zw  = R0
    
    	rjmp RESET
    
    RESET:
    	ldi	Xx, 0xA3 ;was ist die Wurzel aus A3 ?
    	
    	ldi count, 0x0
    Loop1:
    	inc count
    	mul count, count
    	cp zw, Xx
    	brlo	Loop1
    
            ;Ergebniss ist jez in count
    also in Xx steht die zahl von der die Wurzel gezogen werden soll, am ende der schleife steht das ergebniss in count. genauer gehts nich in integer


    also ich war da jez ein bischen faul, denn wenn man das mit 64 bit macht, sauerts länger, also mach folgendes:
    increment nicht um 1 sondern addiere ein register mit anfangs vielleicht 2^8, wenn das ergebniss das erste mal größer war als die gesuchte zahl, zieh vom counter einmal 2^8 ab und shifte das register mit der schrittweite einmal, so dass jez 2^7 drinn steht, wiederhole obe, biss die schrittweite null iss; wennde das ganze nun mit 64 bit oder sowas machen willt musste dier halt'n bischen basteln das die mathematik auch damit geht (muss du mit deinem controller ausmachen )

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests