MIPS Как я могу вычислить числа больше, чем 1,111 x2 ^ 1023? - PullRequest
0 голосов
/ 11 января 2019

Я работаю с MIPS и MARS 4.5. Есть ли способ вычислить числа, которые расширяют диапазон 1.111 .. * 2 ^ 1023?

Например (факториал):

.data
     dval:    .double   171.0  # its working up to 170!
     one:     .double   1.0  

.text
     l.d      $f2, dval
     l.d      $f4, one
     l.d      $f12, one
lo:  c.eq.d   $f2, $f4          # calc factorial of 171 = Infinity 
     bc1t     ex
     mul.d    $f12, $f12, $f2
     sub.d    $f2, $f2, $f4
     j        lo
ex:  li       $v0, 3
     syscall

Как я могу рассчитать и напечатать факториал 171?

1 Ответ

0 голосов
/ 11 января 2019

Удивительно вычислить факториал в FP. Точность числа FP ограничена их мантиссой и на самом деле выше ~ 20 !, вам нужно более 54 бит для хранения (целочисленного) значения, а результат FP является лишь приблизительным и, следовательно, неверный .

Но, если вам нужно только неточное значение в два раза, я бы предложил:

1 / с использованием более простой формулы, такой как формула Стирлинга. https://en.wikipedia.org/wiki/Stirling%27s_approximation#Speed_of_convergence_and_error_estimates Если вы сохраните 4 или 5 чисел в серии Стирлинга, потеря аппроксимации из-за использования этой формулы не будет больше, чем из-за ограниченной мантиссы. (и это будет намного быстрее).

2 / независимо от того, используете ли вы факториал или Стирлинг, вы можете использовать трюк для увеличения показателя в двойном выражении. Идея просто сохранить показатель ниже 2 ^ 512 и после каждого мульта, вы делаете следующую проверку

 int extra_exponent=0;
 double theshold = 2^512;
 double threshold_inv=2^-512;
 ....
 # check exponent on n
 if (n>threshold) {
   n *= threshold_inv ; # reduce exponent
   extra_exponent++ ; # but keep track of it
 }

Вы никогда не переполнитесь, если умножите на число <2 ^ 512. В конце, чтобы получить «реальное» значение, вы должны умножить, но 2 ^ (дополнительно * 512) (что может быть не так просто). И ваша точность ограничена размером мантиссы. </p>

Но лучшее предложение - использовать арифметику с бесконечной точностью. И это единственный способ получить точный результат.

...