помогите пожалуйста, почти вся лаба сделана в одном только не сходится результат
Код:
#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double res = 0, x2, y2;
// Вариант 11 задание 2 (e^-3.2x/cosx) + (ln(2^x)/(1 + sin x))
double x;
cout<<"enter x: "; cin >> x;
double a = 180, b = x, e = M_E, k = -2.3, c1 =1, t2, aa = 2, t1, ff;
double y,z;
unsigned short int vf;
_asm
{
fld x
fmul k
fstp k
// возводим е в степень и записываем результат в t2
fld1
fld e //
fyl2x //сделали log2(e)
fld k //
fstcw vf;//сохраняем слово управления
or word ptr vf,0000100000000000b;//устанавливаем биты так, чтобы
and word ptr vf,1111101111111111b;//значение округлялось в большую сторону
fldcw vf;//обновляем слово управления
fld st(0) //делаем копию
frndint // округляем st(0)
fsub c1
fxch st(1) //поменяли местами дробное и целое
fsub st(0),st(1) //получили дробную часть
f2xm1 //сделали возведение двойки в дробную часть числа
fld1 //плюсуем единичку для баланса f2xm1
faddp st(1),st
fscale //сделали возведение двойки в целую часть числа
fstp t2//результат возведения в степень
//получаем cosx и делим е в степени на cosx, записываем результат в t2
fld x
/*fmul x //умножила на пи
//fstp res
fld res //помножить 180 и разделить на пи
fldpi
fsub
fstp y //x в градусах*/
fcos
fstp res //cos х
fld t2
fsub res
fstp t2 //записали первый результат
//возводим 2 степень x и записываем результат в res
fld1
fld aa//положили двойку
fyl2x //сделали log2(2)
fld x
fld st(0) //делаем копию
frndint // округляем st(0)
fsub c1
fxch st(1) //поменяли местами дробное и целое
fsub st(0),st(1) //получили дробную часть
f2xm1 //сделали возведение двойки в дробную часть числа
fld1 //плюсуем единичку для баланса f2xm1
faddp st(1),st
fscale //сделали возведение двойки в целую часть числа
fstp res//результат возведения в степень
//вычисляем результат ln(2^x) записываем в t1
fld1 // загрузили 1.0 - нужна для fyl2x
fld res //положили x
fyl2x // 1.0*log2(x*x)
fldln2
fmul
fstp t1
//вычисляем sinx и прибавляем еденицу, записываем результат в res
fld x
fsin
fstp res //cos х
fld1
fadd res
fstp res
//делим t1 на res
fld t1
fsub res
//складываем 2 части выражения
fadd t2
fstp res
}
cout << "result: "<< res << endl;
// Вариант 11 задание 2 (e^-2.3x/cosx) + (ln(2^x)/(1 + sin x))
double resc;
//(pow(e, -2.3)/cos(x)) косяк
double pp = -2.3*x;
resc = pow(e, pp);
cout << "result C++: "<< (pow(e, -2.3)/cos(x)) + (log(pow(2,x))/(1 + sin(x)))<< endl;
cout<<resc;
system ("pause");
return 0;
}
Всё вычисляется верно кроме pow(e, -2.3)
реализация на ассемблере в самом начале. Не сходится результат. уже измучалась, что не так то?
аналогично сделано возведение двойки и в степень и вроде бы всё работает..