Асемблер почему выводит всегда одно и то же значение?
#include <iostream>
using namespace std;
int main() {
setlocale(LC_ALL, "Russian");
double x, fa, fb, fx, eps, ans, c;
double three = 3;
double two = 2;
double zero = 0;
double a = 3.141592653589793;
double b = (3 * a) / 2;
cout << "Введите значение eps (точность отыскания корня):" << endl;
cin >> eps;
_asm {
// Вычисляем log(2)(a)+3sin(a)
fld1; загрузка единицы в ST(0)
fld a; загрузка x в ST(0)
fyl2x; вычисляем логарифм x по основанию 2
fst fa; сохраняем промужеточный результат в переменную y
fld a; загрузка x в ST(0)
fsin; вычисляем синус sin(x)
fmul three; умножаем 3 на sin(x)
fadd fa; прибавляем значение 3sin(x) к логарифму x по основанию 2
fst fa; сохраняем итоговый результат в переменную y
// Вычисляем log(2)(b)+3sin(b)
fld1; загрузка единицы в ST(0)
fld b; загрузка x в ST(0)
fyl2x; вычисляем логарифм x по основанию 2
fst fb; сохраняем промужеточный результат в переменную y
fld b; загрузка x в ST(0)
fsin; вычисляем синус sin(x)
fmul three; умножаем 3 на sin(x)
fadd fb; прибавляем значение 3sin(x) к логарифму x по основанию 2
fst fb; сохраняем итоговый результат в переменную y
metka:
// x = (a + b) / 2
fld a
fadd b
fdiv two
fst x
// f(x) * f(a)
fld1; загрузка единицы в ST(0)
fld x; загрузка x в ST(0)
fyl2x; вычисляем логарифм x по основанию 2
fst fx; сохраняем промужеточный результат в переменную y
fld x; загрузка x в ST(0)
fsin; вычисляем синус sin(x)
fmul three; умножаем 3 на sin(x)
fadd fx; прибавляем значение 3sin(x) к логарифму x по основанию 2
fmul fa
ftst
fstsw ax
sahf
jg first_cond
jle second_cond
first_cond:
fld x
fst a
jmp check_while
second_cond:
fld x
fst b
check_while:
fld b
fsub a
fabs
fld eps
fcompp
fstsw ax
sahf
jl metka
fld a
fadd b
fdiv two
fst ans
};
cout << ans << endl;
}
при изменении епс должно же меняться итоговое значение, почему всегда одно и то же? помогите пж
При анализе вашего кода, кажется, что есть проблема в том, как вы сравниваете значения для продолжения итераций в цикле. Вы используете команду jl (Jump if Less) для сравнения и перехода к метке metka, если значение в стеке меньше eps. Однако, возможно, что условие не выполняется из-за проблемы с точностью сравнения чисел с плавающей запятой.
Вместо того, чтобы сравнивать их напрямую, попробуйте изменить подход и использовать разницу между значениями и эпсилон для определения, когда цикл должен завершиться. Вот как это можно сделать:
fld b
fsub a
fabs ; Взять абсолютное значение разницы между b и a
fld eps
fcomip ; Сравнить разницу с eps
fstsw ax
sahf
ja metka ; Перейти к метке, если разница больше eps
Этот код сравнивает абсолютное значение разницы между a и b с eps и переходит к метке metka, если разница больше eps. Это более надежный способ сравнения чисел с плавающей запятой. Попробуйте внести эти изменения и посмотреть, изменится ли результат.