Задать вопрос
@POBOGO
18 лет, учусь программировать.

Где ошибка в коде,сопроцессор?

5c1508797b1d7971066149.pngПроверял пошагово, ошибка находится в конце.
Считает по отдельности правильно, когда начинаю складывать выражение(чтобы поделить первую часть на вторую) не сходится результат с СИ.
#include <windows.h>
#include <stdio.h>
#include <math.h>

int main() {
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	double c, d, a, b = 23, k = 2, result_C = 0, result_ASM = 0, x = 1, y = 4;
	printf("Введите c: "); scanf_s("%lf", &c);
	printf("Введите d: "); scanf_s("%lf", &d);
	printf("Введите a: "); scanf_s("%lf", &a);
	result_C = (2 * c) - (d/23) / log(1 - a / 4);
	__asm {
		finit; // инициализация сопроцессора
		fld d; // st = d;
		fdiv b; // st = d/b;
		fld k; // st = k, st(1) = d/b
		fmul c; // st=k*c, st(1) = d/b
		fsub; // st= k*c-d/b
		FCHS;
		//
		fld1; // st = 1; st(1)=k*c-d/b
		fld a;  // st = a, st(1) = x, st(2)=k*c-d/b 
		fdiv y; // st = a/y, st(1) = 1, st(2)=k*c-d/b 
		fsub;  // st = 1 - a/y;  st(1)=k*c-d/b
		fldln2; // st = ln(2), st(1) = a/y - x; st(2)=k*c-d/b
		fld st(1); // st(0) = a/y - x, st(1) = ln(2),st(2)= a/y - x, st(3) = k*c-d/b
		fyl2x;  // st(0) = ln(1 - a / y), st(2) = k*c-d/b
		fxch st(2); // st = k*c-d/b , st(2)= ln(1 - a / y);
		fdiv st,st(2);
		fstp result_ASM; // result;
	}
	printf("RESULT C: %f\n", result_C);
	printf("RESULT ASM: %f\n", result_ASM);
	system("pause");
	return 0;
}
  • Вопрос задан
  • 76 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@POBOGO Автор вопроса
18 лет, учусь программировать.
Вопрос закрыт. Ошибку нашел.
#include <windows.h>
#include <stdio.h>
#include <math.h>

int main() {
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	double c, d, a, b = 23, k = 2, result_C = 0, result_ASM = 0, x = 1, y = 4;
	printf("Введите c: "); scanf_s("%lf", &c);
	printf("Введите d: "); scanf_s("%lf", &d);
	printf("Введите a: "); scanf_s("%lf", &a);
	result_C = ((2 * c) - (d/23)) / (log(1-a/y));
	__asm {
		finit; // инициализация сопроцессора
		fld d; // st = d;
		fdiv b; // st = d/b;
		fld k; // st = k, st(1) = d/b
		fmul c; // st=k*c, st(1) = d/b
		fsub; // st= k*c-d/b
		FCHS;
		//
		fld1; // st = 1; st(1)=k*c-d/b
		fld a;  // st = a, st(1) = x, st(2)=k*c-d/b 
		fdiv y; // st = a/y, st(1) = 1, st(2)=k*c-d/b 
		fsub;  // st = 1 - a/y;  st(1)=k*c-d/b
		fldln2; // st = ln(2), st(1) = a/y - x; st(2)=k*c-d/b
		fld st(1); // st(0) = a/y - x, st(1) = ln(2),st(2)= a/y - x, st(3) = k*c-d/b
		fyl2x;  // st(0) = ln(1 - a / y), st(2) = k*c-d/b
		fxch st(2); // st = k*c-d/b , st(2)= ln(1 - a / y);
		fdiv st, st(2);
		fstp result_ASM; // result;
	}
	printf("RESULT C: %f\n", result_C);
	printf("RESULT ASM: %f\n", result_ASM);
	system("pause");
	return 0;
}

result_C = (2 * c) - (d/23) / log(1 - a / 4); --> result_C = ((2 * c) - (d/23)) / (log(1-a/y));
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
saboteur_kiev
@saboteur_kiev
software engineer
result_C = (2 * c) - (d/23) / log(1 - a / 4);

У вас сперва происходит деление, а затем вычитание. Возьмите 2(*c) - d(/23) в дополнительные скобки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы