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.