2 / 2 / 1
Регистрация: 04.11.2017
Сообщений: 57

Что то не так с экспонентой в GAS?

20.11.2020, 17:46. Показов 1336. Ответов 2

Студворк — интернет-сервис помощи студентам
Я написал функцию вычисления exp(sin(x)) в виде ассемблерной вставки на C++. Я использовал компилятор G++, поэтому ассемблерные вставки написаны на GAS. Кажется никаких различий между MASM и GAS кроме синтаксиса в данном случае нет:
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
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    float x, res, t;
    cout << "enter x: ";
    for (float x = -10; x < 100; x += 0.01)
    {
        __asm__(R"(
        finit
 
        fld %1 
        fsin
 
        fldl2e
        fmul
        
        fld     %%st
        frndint
        fsub    %%st(1), %%st
        fxch    %%st(1)
        f2xm1
        fld1
        fadd
        fscale
        fstp    %%st(1)
        fstp %4
        )"
            : "=m"(res)
            : "m"(x), "m"(four), "m"(five), "m"(t)
            :);
        cout << x << " " << t << endl;
    }
}
Алгоритм я взял на этом форуме, автор сказал, что он работает, я ему верю.
Я решил проверить ее поэтому сделал график и сравнил его с эталоном. Оказалось, что функция с определенной периодичностью расходится с реальным графиком.
Сам график:

Как видно моя функция по чему - то не доходит до максимума, но в какой то момент резко опускается до минимума.
Помогите найти ошибку.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.11.2020, 17:46
Ответы с готовыми решениями:

Что не так с кодом? ( пытаюсь понять, что не так? )
Есть исходный код. Hook, работает хорошо, но есть минус огромный - перестаёт писать в лог, при открытии программы\игры Фуллскрином. т.е...

Nasm -> Gas
Привет Обясните пожалуйста, как это же сделать но только на Gas? section .bss St db 8 section .text

И так, что не так с моим запросом на добавление записи в таблицу?
$sql = 'INSERT INTO product ' . '(name, code, price, category_id, brand, availability,' . 'description,...

2
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,931
Записей в блоге: 13
20.11.2020, 19:13
Ещё раз сравните с исходным и проверьте двухоперандные инструкции - источник-приёмник в синтаксисах Intel и AT&T располагаются в разной последовательности.

А ещё лучше, приводить минимальную тестовую программу и значение, при котором видны различия в вычислениях.
Мне лень проводить за вас эту работу, поэтому - обойдётесь советом по проверке порядка операндов.

Добавлено через 35 минут
У меня в командной строке включён синтаксис Intel
Замена float на double увеличила точность
Windows Batch file
1
2
mingw32-g++.exe -Wall -fexceptions -g -masm=intel -m32  -c main.cpp -o obj\Debug\main.o
mingw32-g++.exe  -o bin\Debug\main.exe obj\Debug\main.o
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
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    double x, res, t, four, five;
    cout << "enter x: ";
    for (double x = -2; x < 2; x += 0.01)
    {
        asm(
        "finit \n\t"
 
        "fld %1 \n\t"
        "fsin \n\t"
 
        "fldl2e \n\t"
        "fmul \n\t"
 
        "fld     %%st \n\t"
        "frndint \n\t"
        "fsub    %%st(1), %%st \n\t"
        "fxch    %%st(1) \n\t"
        "f2xm1 \n\t"
        "fld1 \n\t"
        "fadd \n\t"
        "fscale \n\t"
        "fstp    %%st(1) \n\t"
        "fstp %4 \n\t"
 
            : "=m"(res)
            : "m"(x), "m"(four), "m"(five), "m"(t)
            :);
        cout << x << " " << exp(sin(x)) << " " << t - exp(sin(x)) << endl;
    }
}
Результат прогона (фрагмент)
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1.79 2.65401 1.96674e-016
1.8 2.64811 -2.79724e-017
1.81 2.64198 1.05384e-016
1.82 2.6356 -2.60209e-018
1.83 2.62898 1.41597e-016
1.84 2.62212 1.39428e-016
1.85 2.61503 1.73472e-017
1.86 2.60771 -2.77556e-016
1.87 2.60016 -6.09322e-017
1.88 2.59238 -1.91036e-016
1.89 2.58438 2.14672e-017
1.9 2.57616 5.72459e-017
1.91 2.56772 5.48606e-017
1.92 2.55907 -2.13805e-016
1.93 2.55021 -1.31839e-016
1.94 2.54115 1.98192e-016
1.95 2.53187 -7.84962e-017
1.96 2.5224 6.39679e-017
1.97 2.51273 -1.37911e-016
1.98 2.50287 -1.67401e-016
1.99 2.49282 -9.75782e-018
0
2 / 2 / 1
Регистрация: 04.11.2017
Сообщений: 57
20.11.2020, 21:04  [ТС]
Проблема действительно была в напрвлении. Спасибо, вот измененный код программы:
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
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    float res;
    for (float x = 0; x < 100; x += 0.1)
    {
        float t;
        __asm__(R"(
        finit
        fld %1
        fsin
        fldl2e
        fmul
        fld     %%st(0)
        frndint
        fsubr   %%st(0), %%st(1)
        fld1
        fscale
        fxch 
        fstp %%st(0)
        fxch
        f2xm1
        fld1
        faddp
        fmul
        fstp %2
        )"
        : "=m"(res)
        : "m"(x), "m"(t)
        :);
        cout << exp(sin(x)) << " " << t << endl;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.11.2020, 21:04
Помогаю со студенческими работами здесь

GAS, неопределённый символ
Вот моя программа, транслируется без ошибок, но мне не нравится, что в листинге транслятор пишет: UNDEFINED SYMBOLS time Как от...

Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее?
Вот код: #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main(){ float a,c; char b; skip: ...

Что в коде ни так? while не работает так, как ожидаю
Написанный код, как я думаю, должен выдавать цифры от 0 до 1000, столбиком. Но выдает начиная от 702 до 1000. Что ни так понимаю, где...

сегодня так можно сказать праздник так что...
простите меня за все пожалуйста!!!

[NASM (GAS)] Stack overflow
Почему при передачи массива float из более чем 255 элементов возникает переполнение и можно ли это как-то обойти?


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

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

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru