С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 2 / 1
Регистрация: 04.11.2017
Сообщений: 57

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

20.11.2020, 17:46. Показов 1304. Ответов 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
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8647 / 4482 / 1669
Регистрация: 01.02.2015
Сообщений: 13,889
Записей в блоге: 12
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
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru