Ich verwende einen ATmega32. An den Programm-Flash habe ich ehrlich gesagt garnicht gedacht (und wusste bis jetzt auch garnicht, wie man Variablen dort abspeichern kann). Habe nämlich C zuerst mit einem PC gelernt, und dort stellt sich diese Frage nicht. Ich weiß zwar, wie man das in ASM macht, dachte aber, dass der C-Compiler alle Variablen (und Konstanten) zuerst in den Flash kopiert, und dann mit ihnen arbeitet. Aber nun werde ich wohl wirklich einfacheine Tabelle anlegen, und aus ihr rauslesen. Werde wohl kaum alle 32kb Flash brauchen...

Der code für sqrt sieht folgendermaßen aus (in C):


Code:
uint8_t squareroot(uint16_t value){
  uint8_t pos = 128, posdiff = 64;
  uint16_t squarepos = 128*128;

  while(posdiff){                                  //Intervallschachtellung
    if(squarepos < value){
      pos += posdiff;
    }else if(squarepos > value){
      pos -= posdiff;
    }else{
      return pos;
      break;
    }
    posdiff /= 2;
    squarepos = pos*pos;
  }

  if(squarepos < value){                              //Annäherung der Variable an eine ganze Zahl
    if((int)((value - squarepos) - ((pos+1)*(pos+1) - value)) > 0){
      return ++pos;
    }else{
      return pos;
    }
  }else if(squarepos > value){
    if((int)((squarepos - value) - (value - (pos-1)*(pos-1))) > 0){
      return --pos;
    }else{
      return pos;
    }
  }else{
      return pos;
  }
}
Die Optimiertung ist auf Stufe s.
Für eine Wurzel brauche ich ca.250T. Math.h braucht im Durchschnitt 820.
Hättest du einen Verbesserungsvorschlag für die Funktion?

Gruß, Yaro