С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
 
NDimas
0 / 0 / 0
Регистрация: 23.05.2018
Сообщений: 9
1

Вычислить произведение ряда с заданной точностью

18.08.2018, 12:54. Просмотров 174. Ответов 2
Метки нет (Все метки)

Дано натуральное число n. Вычислить:
(1-1/2^2)(1+1/3^3)(1-1/4^4)…(1-(-1)^(n-1)/n^n)
Вычисления проводятся до пятого знака после запятой.

ПОМОГИТЕ. Проблема с числа с плавающей точкой, как их получить и как с ними работать
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2018, 12:54
Ответы с готовыми решениями:

Вычислить сумму ряда с заданной точностью
Вычислите, используя FPU, следующую сумму с точностью до e= 0,001....

Вычислить сумму ряда с заданной точностью
Calculate, using FPU, the following sum with accurate to \varepsilon =0.001:...

Вычислить сумму ряда с заданной точностью
Вычислите, используя FPU, следующую сумму с точностью до e = 0,001: входные...

Вычислить сумму ряда с заданной точностью
Вычислите, используя FPU, следующую сумму с точностью 0,001:

Вычислить сумму ряда с заданной точностью
Вычислите, используя FPU, следующую сумму с точностью до e(epsilon)= 0.001:

2
ФедосеевПавел
Модератор
3860 / 2180 / 895
Регистрация: 01.02.2015
Сообщений: 7,263
18.08.2018, 13:08 2
Для начала изучите, как работать с математическим сопроцессором.

В подразделе "Ассемблер: математика, вычисления" множество примеров (да он собственно монопольно и собирает всю работу с FPU) с сопроцессором.

Пояснения по используемым командам в главе 11 Электронный учебник

Ход и результаты вычисления можете наблюдать в окне отладчика TurboDebugger (TD) - там, правда, не каждая версия подходит.

После освоения - попробуйте вводить и выводить числа в формате с плавающей запятой.
Примеры ввода и вывода есть на форуме.
Вывод в теме Ввод и вывод чисел в различных системах счисления и в подразделе примеры применения.
Ввод тоже неоднократно рассматривался, сразу и не вспомню в каких темах, но это найдёте позже.

Постарайтесь реализовать самостоятельно. До конца года я буду занят и по выходным, т.ч. поправить код смогу, а "с нуля" - нет.

Успехов.
0
ФедосеевПавел
Модератор
3860 / 2180 / 895
Регистрация: 01.02.2015
Сообщений: 7,263
21.08.2018, 21:30 3
Это для masm32 Windows. Под tasm и DOS доработаете самостоятельно
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
.386
.model flat, stdcall
option casemap: none
        include d:\masm32\include\windows.inc
 
        include d:\masm32\include\user32.inc
        include d:\masm32\include\kernel32.inc
        include d:\masm32\include\masm32.inc
 
        includelib d:\masm32\lib\user32.lib
        includelib d:\masm32\lib\kernel32.lib
        includelib d:\masm32\lib\masm32.lib
.data
.const
        aszConsoleTitle db      'Product', 0
        aszMsgResult    db      0Dh, 0Ah, 'Result: ', 0
        aszPressEnter   db      0Dh, 0Ah, "Press ENTER to exit", 0
        Eps             dq      0.00001
 
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        Buffer          db      128 dup(?)
        BufLen          dd      ?
        Result          dq      ?
 
.code
 
start:
        invoke  SetConsoleTitle, ADDR aszConsoleTitle
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
 
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
 
        ;invoke  ClearScreen
 
        finit
        fld     [Eps]   ;st() - точность вычислений
        fld1            ;st() - значение произведения ряда на предыдущей итерации
        fld1            ;st() - i
        fld1            ;st() - знак
 
        fld1            ;st() - текущее значение произведения
        @@repeat:
 
                fld     st(1)           ;sign:=-sign
                fchs
                fst     st(2)
                fld     st(3)           ;i:=i+1
                fld1
                faddp   st(1),  st(0)
                fst     st(4)
                fld     st(0)           ;st(0):= i^i
                call    power
                fdivp   st(1),  st(0)   ;st(0):=sign/(i^i)
 
                fld1
                faddp   st(1),  st(0)   ;st(0):=1+sign/(i^i)
 
                fmulp   st(1),  st(0)
 
                fld     st(3)           ;если разность значений произведений
                fsub    st(0),  st(1)   ;текущей и предыдущей итерации больше
                fabs                    ;заланной погрешности, то повторить
                fcomp   st(5)           ;цикл
                fstsw   ax
                sahf
 
                fst     st(3)           ;сохранить текущее значение произведения
        jae     @@repeat
 
        fst     [Result]
        ;очистка FPU
        finit
        ;вывод результата
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgResult,\
                LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL
        invoke  FloatToStr2, [Result], ADDR Buffer
        invoke  StrLen, ADDR Buffer
        mov     [BufLen],       eax
        invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
 
        ;ожидание нажатия ENTER
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
                LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
 
        invoke  ExitProcess, 0
 
 
;Показательная функция f=a^x
;на входе:
;  st(0) - значение аргумента x
;  st(1) - значение аргумента a
;на выходе:
;  st(0) - значение показательной функции
;Способ вычисления
;f=a^x=exp(ln(a^x))=exp(x*ln(a))
power   proc
        LOCAL   @StateFPU[108]:byte     ;108 use32, 94 use16
        LOCAL   @X:QWord
        LOCAL   @A:QWord
        LOCAL   @Result:QWord
        ;перед очисткой стека FPU сохраним:
        fstp    [@X]            ; вершину стека (аргумент функции)
        fstp    [@A]            ; вершину стека (аргумент функции)
        fsave   [@StateFPU]     ; состояние FPU
        ;перед началом работы очищаем стек FPU
        finit
        ;в вершину стека помещаем аргумент функции
        fld     [@A]
        fld     [@X]
        ;вычисление функции
        fxch    st(1)           ; st(0)=a       st(1)=x
 
        fldln2                  ; st(0)=ln(2)   st(1)=a         st(2)=x
        fxch    st(1)           ; st(0)=a       st(1)=ln(2)     st(2)=x
        fyl2x                   ; st(0)=log2(a)*ln(2)=ln(a)     st(1)=x
 
        fmulp   st(1),  st(0)   ; st(0)=x*ln(a)=B
 
        fldl2e                  ;st(0)=1/ln(2)=log2(e)
        fmul                    ;st(0)=B/ln(2)=B*log2(e)
        fld     st
        frndint
        fsub    st(1), st
        fxch    st(1)
        f2xm1
        fld1
        fadd
        fscale
        fstp    st(1)
 
        ;перед восстановлением состояния FPU сохраним результат функции
        fst     [@Result]
        ;восстановление состояния FPU
        frstor  [@StateFPU]
        ;результат вычислений на вершину стека
        fld     [@Result]
 
        ret
power   endp
 
end start
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2018, 21:30

Вычислить сумму ряда с заданной точностью
Вычислите, используя FPU, следующую сумму с точностью 0.001 Исходные данные...

Вычислить сумму ряда с заданной точностью
Вычислите используя FPU следующую сумму с точностью с точностью E=0.001...

Вычислить сумму ряда с заданной точностью
Вычислите, используя FPU, следующую сумму с точностью до е= 0,001:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru