Gast
#2698816
Der Betreff sagt es ja schon. Hat jemand eine fertige Routine?
|
Anzeige
|
40 bit Wurzel AVR ASM
Gast
#2698816
Der Betreff sagt es ja schon. Hat jemand eine fertige Routine? Sebi schrieb: > Der Betreff sagt es ja schon. Schön wärs. ;-) Für welchen Mikrocontroller genau? Was meinst du mit 40 Bit? Ist das die Genauigkeit der Zahl? In welchem Format hast du den Radikand und in welchem Format brauchst du das Ergebnis?
Gast
#2698994
Hallo Markus, entschuldige, dass ich die Informationen vergessen habe. Also: -ATMEGA88PA Format Radikand: 40bit Integer Format Ergebniss: 20bit Integer, gerundet (ob auf oder ab ist ja egal)y Ich hab mir schon die 32bit Wurzel Funktion hier im Wiki angeschaut. Allerdings weiß ich nicht, wie ich die "erweitern" kann. Sebi schrieb: > Ich hab mir schon die 32bit Wurzel Funktion hier im Wiki angeschaut. > Allerdings weiß ich nicht, wie ich die "erweitern" kann. Anstatt 4-Byte Eingabe wird's eine 5-Byte Eingabe. Anstatt 2-Byte Ausgabe wird's eine 3-Byte Ausgabe. In einem ersten Schritt kannst du die hartcodierten Register zum bwesseren Überblick ersezten:
wird dann zu
In einem 2. Schritt erweiterst du dann die Arbeitsregister zur jeweils benötigten Bitbreite:
Die Shifts oben musst noch nachrechnen (Hausaufgabe). hmmm. oder erweitern auf 6 Byte Radikant, die Routine setzt wohl voraus, daß der Radikant eine gerade Anzahl Bytes groß ist, d.h. das Erhebnis nicht 2.5 Bytes groß ist.
Gast
#2699987
Ich werde mich mal an der 48bit Variante versuchen und die dann hier posten.
Gast
#2700046
Zur Erweiterung auf 40 bit sollte auch die Näherung
gut sein.
Gast
#2700489
Verlfucht, ich krieg es nicht hin. Andere Baustelle: Heron Verfahren. Wie krieg ich das ohne die Division Xn/a hin? Division durch zwei ist ja kein Ding (shift) aber die andere Division bereit mir Kopfzerbrechen. Wolfgang schrieb: > Zur Erweiterung auf 40 bit sollte auch die Näherung >
> gut sein.
Aber nur für |x| << 1
Gast
#2700995
das ist der klägliche Versuch. Hallo, als ich sqrt(1+x) = 1 + x/2 + eps heute gesehen habe, fiel mir spotan soetwas ein: Falls die Zahl kleiner 32 -Bit ist einfach 32 Bit Rechnung.-> trivial. Falls die Zahl >=2^32 ist dann die Zahl aufspalten N = K*256 + C mit K = oberen 32 Bits und C = N mod 255 also die unter 8 Bit Wurzel(N)=Wurzel(K*256 + C) erweitert mit 1=Wurzel(K*256)/Wurzel(K*256) =Wurzel(K*256)*Wurzel( (K*256)/(K*256) + C/(K*256)) = Wurzel(K*256)*Wurzel( 1+ C/(K*256)) x = c/(256*K) | irgenwas kleiner 2^-24 < 1e-7 = 16*Wurzel(K) + (16*Wurzel(K)* C/(256*K)/2 = 16*Wurzel(K) // + C/(16*Wurzel(K))/2 < 1/512 ) Dummerweise ist Wurzel(K) nur eine 16 Bit Integerzahl. :-( Wenn man eine Wurzelfunktion hätte, die 32 Bit integer ins 16.8 Format umrechnen würde, hätte man ein Chance. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|