
Вычисления с n значащими цифрами
Дрейфус, Ганглоф - Практика программирования на Фортране, стр.49 .
Числа с плавающей запятой обычно имеют от 6 до 9 значащих цифр, числа с фиксированной запятой - от 10 до 12. Если же требуется получить больше значащих цифр, то их можно получить лишь с использованием плавающей запятой с двойной точностью (от 16 до 24). Если же хотят проводить вычисления со 100 значащими цифрами, то надо придумать что-нибудь другое.
Предположим, что необходимо провести вычисления со 100 цифрами. В этом случае можно использовать слова, каждое из которых содержит, например, по 6 цифр. Таким образом для 100 цифр понадобятся 17 слов, при этом получим даже 102 цифры.
Обратные величины от целого числа: Требуется вычислить и напечатать число, обратное целому числу N .. Применяют следующий метод:
Делят 1 000 000 на выбранное число N. Частное от деления дает первые 6 цифр результата. Остаток, умноженный на 1 000 000, в свою очередь делится на N, и частное этого деления дает следующие 6 цифр результата. Процесс продолжается до тех пор, пока не будут получены все требуемые цифры. Например, для N = 19:
(1 · 1 000 000) / 19 = 052 631 R = 11
(11 · 1 000 000) / 19 = 578 947 R = 7
(7 · 1 000 000) / 19 = 368 421 R = …
откуда 1/19 = 0.052 631 578 947 368 421 …
Ввод n
Описание массива k[17]
m = 1 000 000
Вывод
n, ' 0.'
Для I=1 до 17
k[I]=Int(m/n)
Вывод k[I]
n2=m-k[I]*n
m=n2*1 000 000
Факториал: вычислить с 102 значащими цифрами n! для n в интервале от 1 до 70. Для этого в первое слово массива записывают 1, в остальных словах оставляют нули.
Чтобы получить n!, если известно (n-1)!, умножают последовательно каждое слово на n. Если в промежуточном произведении больше 6 цифр, то избыточные слева цифры надо прибавить к следующему частному произведению. Например
18! = 6 402 373 705 728 000
728 000 · 19 = 13 832 000
¾¾¾¾¾¾¾¾¿
13 + 373 705 19 = 7 100 408
¾¾¾¾¾¾¾¾¿
7 + 6 402 · 19 = 0 121 645
откуда 19! = 121 645 100 408 832 000 .
dimension k(17)
do I=1,17 : k(I) = 0
k(1) =1
do 2 I=1,70
m=0
do 3 j=1,17
k(j) = k(j) * I + m
m = k(j)/1000000
k(j)=mod(k(j),1000000)
3 continue
print I, k(I)
2 continue
Число е, основание натуральных логарифмов вычислить 102 первых десятичных разряда числа е с помощью ряда:
e = 1 + 1/1! + 1/2! + 1/3! + … + 1/n! .
Необходимо иметь три переменных (или, точнее, три массива): J, K и L .Чтобы получить 1.n! будем делить 1/(n-1)! на n! .
K будет содержать 1/(n-1)!
L будет содержать частное от деления K на n.
J накапливает сумму последовательных значений 1/n!: это и будет значение е.
К присваивается начальное значение 5000…0, что представляет собой 1.2! . При этом вычисляется лишь дробная часть числа, а целая часть (равная 2) должна быть включена заранее в формат печати.
Получение двух последовательных значений (J=L+J) производится справа (самое большое значение индекса). Так как в этом точном случае перенос может принимать лишь значение 0 или 1, желательно избежать деления и вычисления остатка и ограничиться операциями сравнения и вычитания.
Dimension j(17), k(17), L(17)
do 1,17 j(I)=0: k(17)=0
k(1)=500000
j(1)=k(1)
do 3 n=3,70
m=0
do 2 I=1,17
L(I) = (k(I)+m)/n
m = mod(k(I)+m,n)*1000000
2 continue
do 5 I=1,17
5 k(I)=L(I)
m=0
I=17
8 continue
j(I)=j(I)+L(I)+n
m=0
if j(I) > 1000000 then goto 7
j(I)=j(I)-1000000
m=1
7 continue
I=I-1
if I > 1 then goto 8
print(n, " 2.")
Print(j)
3 continue