Форум программистов, компьютерный форум, киберфорум
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 14.10.2018
Сообщений: 122
1
C/C++

[FPU] Вычислить выражение по формуле

06.12.2020, 13:51. Показов 2860. Ответов 8

Author24 — интернет-сервис помощи студентам
Добрый день. Пытаюсь разобраться с математическим сопроцессором на ассемблере. Не пойму порядок действий и присвоение значений. Посчитал значение для arctg(a/d), все совпадает. Но вот как сделать так, чтобы было log2(a)/(arctg(a/d)) не могу понять. Само задание: r=a*b+b*(log2(a)/(arctg(a/d)))+z, с первой частью может еще и разберусь, а вот со 2 проблемы. Буду благодарен за любую подсказку. Возможно кто-то находил нечто подобное.
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
// aks7.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//
 
#include <iostream>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
using namespace std;
int main()
{
    setlocale(LC_ALL, "Rus");
    system("color F0");
    double a, b, d, r = 0;
    int z;
    cout << "Введите а \t";
        cin >> a;
        while (a == 0) {
            cout << "Введен 0, повторите ввод\n";
            cin >> a;
        }
 
      cout << "Введите d \t";
      cin >> d;
      while (d == 0) {
          cout << "Введен 0, повторите ввод\n";
          cin >> d;
      }
      cout << "Введите b \t";
      cin >> b;
      cout << "Введите z \t";
      cin >> z;
      _asm {
          finit; инициализировать сопроцессор
          FINIT
 
          FLD a
          FLD d
          FPATAN
          ; fld a
          ; fyl2x
          ; fdiv
 
 
 
          FSTP r
          
      }
      cout << "R=" << r;
      system("pause");
      return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2020, 13:51
Ответы с готовыми решениями:

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

Вычислить используя FPU выражение. Ассемблер
Помогите реализовать тригонометрическое выражение с вещественными числами на TASM. Как их вообще...

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

Вычислить выражение по формуле
Дан пример: 2,25/1.125-0,5*0,875/(2,75+0,75). Не выходит верный ответ вообще, все что знал...

8
1566 / 1492 / 248
Регистрация: 19.02.2010
Сообщений: 4,048
06.12.2020, 14:12 2
Цитата Сообщение от Invisibletime Посмотреть сообщение
Посчитал значение для arctg(a/d), все совпадает.
Как может совпадать, если нет команды деления для вычисления a/d?
0
2 / 2 / 0
Регистрация: 14.10.2018
Сообщений: 122
06.12.2020, 14:27  [ТС] 3
Находил как раз решение для arctg, fpatan автоматически делит a на d, и вроде как перезаписывает новое значение именно в a. Поэтому то я и не могу понять как повторно использовать переменную а, т.к она повторяется трижды.

Добавлено через 1 минуту
VTsaregorodtsev, так или иначе, вероятнее всего Вы не особо разбираетесь в этой тебе, раз уж такое пишите.
0
1566 / 1492 / 248
Регистрация: 19.02.2010
Сообщений: 4,048
06.12.2020, 14:40 4
Цитата Сообщение от Invisibletime Посмотреть сообщение
и вроде как перезаписывает новое значение именно в a.
не в а - а в регистр на вершине стека.
0
Модератор
Эксперт по электронике
8522 / 4376 / 1648
Регистрация: 01.02.2015
Сообщений: 13,598
Записей в блоге: 9
06.12.2020, 19:10 5
Invisibletime, а что мешает поместить переменную a не только в вершину стека?
Assembler
1
2
3
4
5
6
7
8
9
finit
fld [a]
fld st(0)
fld [d]
fpatan   ;st(0) - arctg, st(1) - a
 
fld1
fld st(2); для вычисления логарифма
..........
0
2 / 2 / 0
Регистрация: 14.10.2018
Сообщений: 122
06.12.2020, 20:08  [ТС] 6
И действительно, большое спасибо за отличную подсказку. Так ,наверное, более менее разберусь
0
2 / 2 / 0
Регистрация: 14.10.2018
Сообщений: 122
07.12.2020, 18:26  [ТС] 7
Здравствуйте. Почти доделал программу, но вот одна загвоздка, не могу разобраться как связать 2 части кода, а именно (a*b)+(ln(a) / arctg(a / d) + z). (ln(a) / arctg(a / d) + z)- эта часть 100% рабочая, но так как st перезаписывается, то не получается провести сложение с (a*b). Возможно можно как-то записать с сохранением в st(2) допустим, сам такою команду не находил.
C
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
#include <iostream>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
using namespace std;
int main()
{
    setlocale(LC_ALL, "Rus");
    system("color F0");
    double X, b, d, r = 0;
    double z,m;
    cout << "Введите а \t";
        cin >> X;
        while (X == 0) {
            cout << "Введен 0, повторите ввод\n";
            cin >> X;
        }
 
      cout << "Введите d \t";
      cin >> d;
      while (d == 0) {
          cout << "Введен 0, повторите ввод\n";
          cin >> d;
      }
      cout << "Введите b \t";
      cin >> b;
      cout << "Введите z \t";
      cin >> z;
      _asm {
          finit; инициализировать сопроцессор
          FINIT
 
          FLD X; st(0)
          FLD d; st(0) = d, st(1) = a
          FPATAN; st(0)
          fld1
          fld X; st(2)
          FYL2X
          fdiv st(0), st(1); st(0) = ln(a) ln(a) / arctg(a / d)
          fld b
          fmul
 
 
          fld z
          fadd; ln(a) ln(a) / arctg(a / d) + z
          fld st(2);/////
          
 
          fld X
              fld b
              fmul st(0), st(1)
 
              fadd st(0), st(2);/////
 
          FSTP r
          
      }
      cout << "R=" << r;
      system("pause");
      return 0;
}
Добавлено через 38 минут
Все таки сумел разобраться. Вот код, если кому-то понадобится
C
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
#include <iostream>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
using namespace std;
int main()
{
    setlocale(LC_ALL, "Rus");
    system("color F0");
    double X, b, d, r = 0;
    double z,m,f;
    cout << "Введите а \t";
        cin >> X;
        while (X == 0) {
            cout << "Введен 0, повторите ввод\n";
            cin >> X;
        }
 
      cout << "Введите d \t";
      cin >> d;
      while (d == 0) {
          cout << "Введен 0, повторите ввод\n";
          cin >> d;
      }
      cout << "Введите b \t";
      cin >> b;
      cout << "Введите z \t";
      cin >> z;
      _asm {
          finit; инициализировать сопроцессор
          FINIT
          
          FLD X; st(0)
          FLD d; st(0) = d, st(1) = a
          FPATAN; st(0)
          fld1
          fld X; st(2)
          FYL2X
          fdiv st(0), st(1); st(0) = ln(a) ln(a) / arctg(a / d)
          fld b
          fmul
 
 
           fld z
           fadd; ln(a) ln(a) / arctg(a / d) + z
           fstp st(2)
          
           fld X
           fld b
           
           fmul st(0),st(1)
           fstp st(1)
 
           fadd st(0),st(2)
 
 
          FSTP r
          
      }
      cout << "R=" << r;
      system("pause");
      return 0;
}
0
Модератор
Эксперт по электронике
8522 / 4376 / 1648
Регистрация: 01.02.2015
Сообщений: 13,598
Записей в блоге: 9
07.12.2020, 18:30 8
Сделайте (a*b) в первую очередь, а потом и всё остальное.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fld [a]
fld st(0)
fmul [b]
 
fxch st(1)
 
fld1
fld st(1)
FYL2X
 
fxch st(1)
fld [d]
fpatan
 
fdivp st(1), st(0)
.............
1
2 / 2 / 0
Регистрация: 14.10.2018
Сообщений: 122
07.12.2020, 19:00  [ТС] 9
Большое спасибо, но уже все и так получилось
0
07.12.2020, 19:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2020, 19:00
Помогаю со студенческими работами здесь

Вычислить выражение по формуле
Помогите написать программу с арифметическими командами на сопроцессоре. ( что бы были +,-,*,/)...

Вычислить выражение по формуле
Помогите вычислить на ассемблере, именно сам код вычисления

Вычислить выражение по формуле
Помогите пожалуйста решить пример на паскале все отлично могу решить, а вот с ассемблером мы явно...

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

Вычислить выражение по формуле
Всем привет! Написал код, который считает мне выражение: (c * tan(d + 16)) / (a / 2 - 4 * d - 1)...

Вычислить выражение по формуле
Не могу решить задачу на ассемблере. Пример нужно решить в программе Microsoft Visual Studio в C++ ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru