[asm] Algorytm na odwrotność pierwiastka

0

Witam

Mam problem z algorytmem. Mam napisac odwrotnosc pierwiastka w asemblerze (NASM) ale bez używania instrukcji zmiennoprzecinkowych. Oczywiscie mozna uzyc algorytmu Newtona-Rhapsona (jesli ktos kojarzy). Jesli ktos ma jakis pomysl, jak go zaimplementowac bez instrukcji zmiennoprzecinkowych o bylbym wdzieczny za wszelka pomoc.

0
kamil_w napisał(a)

Witam

Mam problem z algorytmem. Mam napisac odwrotnosc pierwiastka w asemblerze (NASM) ale bez używania instrukcji zmiennoprzecinkowych. Oczywiscie mozna uzyc algorytmu Newtona-Rhapsona (jesli ktos kojarzy). Jesli ktos ma jakis pomysl, jak go zaimplementowac bez instrukcji zmiennoprzecinkowych o bylbym wdzieczny za wszelka pomoc.

Jeśli precyzja nie musi być zbyt duża, to liczysz na int,
typ fixed:

n - 32 (lub 64) bitowa liczbę interpretujesz jako:
wartość = HiWord(n) + LoWord(n)/2^16

czyli dolna połowa jest częścią ułamkową, a górna całkowitą.

w c++ wygląda to tak:

struct Fixed
{
  long value;
  setValue(int v) { value = v << 16; }
  setValue(int k, int n) { value = long(k) * 65536L / n; } // ułamek: k/n
  
  Fixed& operator += (Fixed v) { value += v.value; return *this; }
  Fixed& operator -= (Fixed v) { value -= v.value; return *this; }
  Fixed& operator *= (Fixed v) { value = (value >> 8) * (v.value >> 8); return *this; }
};


Fixed a(1), b(1,2);

a += b; // a = 1.5
a *= Fixed(314,100);  // a = 1.5 * 3.14

Jak widać, wszystko liczymy na liczbach całkowitych.

0

Hehe

Spoko w c++ z przeciazaniem operatorow i klasami to jest bardzo latwe. Zreszta widzisz;) Natomiast co innego jak mowimy o assemblerze;)

0

Robisz najpierw algorytm, późniejsze zakodowanie w c, c++, czy w asm to zwykła rozrywka - chyba, że chcesz zakodować to w czymś czego nie znasz, ale to już inna bajka... coś w stylu: skok z motyką na księżyc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1