@happyPolina

Странный ответ на простейшее алгебраическое выражение ( c# )?

Знатоки c# подскажите, пожалуйста, в чем проблема.. Когда ввожу a = 1000 и b = 0,0001 выдаёт неправильный ответ (6250001), а программа в теории должна всегда выводить «1»...
В чем может быть подвох??

((a + b)^2 - (a^2 + 2ab)) / b^2

using System;

namespace Task3
{
	class MainClass
	{
		public static void Main(string[] args)
		{
			float a, b;
			bool ok;
			do
			{
				Console.WriteLine("Enter the number 'a', using a comma for real");
				string buf = Console.ReadLine();
				ok = float.TryParse(buf, out a);
				if (ok == false) Console.WriteLine("Error! Entering a number, please, thry again");
			} while (ok == false);
			do
			{
				Console.WriteLine("Enter the number 'b', using a comma for real");
				string buf = Console.ReadLine();
				ok = float.TryParse(buf, out b);
				if (ok == false) Console.WriteLine("Error! Entering a number, please, thry again");
			} while (ok == false);
			if (b == 0) Console.WriteLine("Error!");
			else
			{
				float c = (float)Math.Pow(a + b, 2);
				float d = (float)Math.Pow(a, 2);
				float e = (float)2 * a * b;
				float f = (float)Math.Pow(b, 2);
				float g = (float)(c - (d + e)) / f;
				Console.WriteLine($"((a + b)^2 - (a^2 + 2ab)) / b^2 = {g}, a = {a}, b = {b}");

			}

		}
	}
}
  • Вопрос задан
  • 162 просмотра
Пригласить эксперта
Ответы на вопрос 2
@vabka
Fullstack dev
Вот ещё мой вариант, как можно переписать код: https://dotnetfiddle.net
Код

namespace Task3
{
	class MainClass
	{
		public static void Main(string[] args)
		{
			const string expression = "((a + b)² - (a² + 2ab)) / b²";
			Console.WriteLine(expression);

			var a = GetDouble("a");
			var b = GetDouble("b");

			if (b == 0)
			{
				Console.WriteLine("Invalid value of b");
				return;
			}


			var result = EvaluateExpression(a, b);

			Console.WriteLine(@$"a = {a};
b = {b};
{expression} = {result}");
		}

		private static double GetDouble(string varName)
		{
			Console.WriteLine($"Enter the number '{varName}', using a '.' for fractional part");
			double value;
			while (!double.TryParse(Console.ReadLine(), NumberStyles.Float | NumberStyles.Integer, CultureInfo.InvariantCulture, out value))
				Console.WriteLine("Wrong number format, please try again");
			return value;
		}

		private static double EvaluateExpression(double a, double b) =>
		 (Math.Pow(a + b, 2) - (Math.Pow(a, 2) + 2 * a * b)) / Math.Pow(b, 2);

	}
}
Ответ написан
@Sumor
У float маленькая разрядность - используйте double.
Идёт округление и ошибки округления накапливаются.

Хотя https://dotnetfiddle.net по этому коду даёт единицу.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы