Loading...
ioanna.konova avatar ioanna.konova 47 Точки

[Homework] C# Basics - Primitive Data Types and Variables - Comparing Floats

Здравейте! smiley

Осъзнавам, че въпросът ми е мега тъп,... някой може ли да ми обясни каво точно се иска от условието на задача 13.

Разгледах доста постове по този въпрос във форума, но още повече се обърках.

Благодаря много предварително! blush

1
Programming Basics
slavpetroff avatar slavpetroff Trainer 155 Точки

Заради начина по който компютъра представя дробните числа в паметта си,не можем директно да ги сравняваме чрез операторите за сравнение.Т.е можем,но има вероятност за грешен резултат.Идеята е,че си декларираме една променлива,която е допълнителна - "eps" и я инициализираме с някаква стойност.В случая от домашното,тази стойност е : 0.000001 .Тази променлива играе ролята на еталон за точност.Т.е ако искаме да проверим a > b ? ,първо намираме тяхната разлика и получената разлика,сравняваме с нашия еталон за точност - eps.Иначе казано,при сравнение на дробни числа,сравняваме не числата,а тяхната разлика с еталон за точност.

1
04/11/2015 21:36:33
miroLLL avatar miroLLL 95 Точки

Мм, най-лесно казано, въвеждаш 2 числа, ако разликата между тях е по-голяма от 0.000001, отпечатваш ЛЪЖА. В противен случай, ако разликата е по-малка от 0.000001 отпечатваш ИСТИНА. Както се вижда на примера, ако разликата е равна на 0.000001 отново се отпечатва ЛЪЖА с допълнителено обяснение.

Можеш да видиш моето решение на задачата - ЦЪК, ако ти е от полза по един или друг начин.

1
ioanna.konova avatar ioanna.konova 47 Точки

Много благодаря за отговорите! Бяха много полезни! smiley

Ето какво сътворих - ТУК. Сравних числата от примера и мисля, че ми се получиха отговорите, но разликите на двете числа ми се изпринтва много странно. Само на последните числа /4,999999 и 4,999998/ ми се получава True и това много на дава мира! :D

И другото, което забелязах, е че се чупи при въвеждане на точка вместо запетая. Това проблем ли е?

1
miroLLL avatar miroLLL 95 Точки

На места ти показва вярно, а на други грешно. Причината е, че изваждаш първото число от второто, и когато второто е по-голямо от първото излиза отрицателно число.

Имаш и малко противоречие на 22 ред. На 20 ред проверяваш дали третото число е по-голямо от епса, а след това отпечатваш, че епса е по-голям от числото. Просто смени знака, когато е ЛЪЖА третото число е по-голямо ">" от епса.

Другата нередност, която забелязвам аз, е че в проверката на 20 ред проверяваш дали числото е по-голямо или РАВНО на епса, а в другия случай отпечатваш ИСТИНА, числото е РАВНО на епса... Просто когато третото число, е равно на епса, извършва действията и в двата случая, затова се получава така..

А това лесно можеш да оправиш - Control Panel --> Region and Language --> Region --> Additional Settings --> Decimal Symbol го променяш на точка ".". --> Apply + OK.

Поздрави!

1
05/11/2015 00:27:02
ioanna.konova avatar ioanna.konova 47 Точки

Мисля, че си оправих грешките - ТУК. Но все още не мога да разбера едно нещо.

Така...

Числата, които връщат резултат TRUE и тяхната разлика са съответно:

1) 5.00000001 и 5.00000003 = 5.00000003 - 5.00000001 = 0.00000002;
2) 5.00000005 и 5.00000001 = 5.00000001 - 5.00000005 = - 0.00000004;
3) -0.0000007 и 0.00000007 = 0.0000007 - (- 0.00000007) = 0.00000077;

Разликите и на трите числа са < от eps /0.000001/.

Това, което не мога да разбера е защо последната двойка числа 4.999999 и 4.999998 връща резултат FALSE, тъй като разликата им е 4.999998 - 4.999999 = - 0.000001, което също е < от eps /0.000001/. Следователно резултатът би трябвало да TRUE, а не FALSE!

Правилно ли мисля или някъде пак бъркам???

1
05/11/2015 23:52:02
raging avatar raging 92 Точки

Explanation : Border case. The difference 0.000001 == eps. We consider the numbers are different.

1
a_angelov_angelov avatar a_angelov_angelov 2 Точки

using System;

class ComparingFloats
{
    static void Main()
    {
        double firstNumber = double.Parse(Console.ReadLine());
        double secondNumber = double.Parse(Console.ReadLine());

        bool areEqual = Math.Abs(firstNumber - secondNumber) < 0.000001;
        //Math.Abs - Returns the absolute value of a specified number.    

        Console.WriteLine(areEqual);
    }
}


Минусът е проблема при последните два случая (минус * минус == плюс), от което следва че е необходимо да вземеш абсолютните стойности на input-a. Това става с метода Abs от класа Math -> Math.Abs()

1
ioanna.konova avatar ioanna.konova 47 Точки

Да, май вече наистина си открих грешките.

Първата е, че изваждах от 2-то число 1-то, а то трябва да е обратното - от 1-то да извадя 2-то число

Втората ми грешка е, че въобще не се сетих да използвам Math.Abs.

Но важното е, че накрая ми се получи /поне така мисля, де smiley/.

Даже бих дала съвет да използвате това: Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;, за да не гърми на проверяващите, които използат "." вместо ",".

Ето и крайния ми вариянт - ТУК.

Поздравчета smiley

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.