Archiv verlassen und diese Seite im Standarddesign anzeigen : suche: wurzel aus 8 bytes (aus 64-bit zahl)
nestandart
13.04.2007, 20:08
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 ?
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? ;)
nestandart
13.04.2007, 22:47
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....
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? 8-[
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.
Olso:
ich hab jez nur nen Mega8 aber der assembler code würde in etwa folgendermaßen lauten (AVRStudio):
.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 :) )
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.