Категория
Loading...
+ Нов въпрос
ladymira avatar ladymira 5 Точки

Data Types and Methods, problem 02 - Circle Area (Precision 12)

Здравейте!

Условието е при подаден радиус реално число да се получи лицето на кръга с точност до 12-тия знак. Моля да ме насочите къде ми е грешката, дава ми грешни отговори на 3-ти и на 4-ти тест в джъджа. Самите тестове не знам къде да ги видя, за да си открия сама грешката. С данните от условието отговорите ми са точни, но за тези 3-ти и 4-ти тест не знам какви данни се подават и защо ми дава грешка. Ето го кода ми:

http://pastebin.com/Jp82pg0Z

Тагове:
0
Programming Fundamentals
KrasimirPetkov avatar KrasimirPetkov 331 Точки
Best Answer

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

Ето какво се получава при използване на еднакви стойности с double и decimal:

Радиус при double -  3000, лице: 28274333.882308100000

Радиус при decimal - 3000, лице: 28274333.882308110000

Кодът, който съм използвал:

using System;

class Program
{
    static void Main()
    {
        double r1 = double.Parse(Console.ReadLine());
        decimal r2 = decimal.Parse(Console.ReadLine());
        double result1 = Math.PI * r1 * r1;
        decimal result2 = (decimal)Math.PI * r2 * r2;
        Console.WriteLine("{0:f12}", result1);
        Console.WriteLine("{0:f12}", result2);
    }
}

 

 

3
19/05/2016 15:49:15
ladymira avatar ladymira 5 Точки

Благодаря, колега. Точно това се чудех и аз, след като decimal е с по-галям обхват, защо с doublе работи, а с decimal не ще да работи. Явно 3-тия и 4-тия тест са с някакви такива по-големи стойности от порядъка на хиляди, и оттам идва разминаването.

Благодаря на всички още веднъж. Поздрави!

0
DimiTVP avatar DimiTVP 54 Точки

Аз съм го направил с double и не е нужно да кастваш Math.Pi

1
DimiTVP avatar DimiTVP 54 Точки

Това е моето:
http://pastebin.com/SiCHrmuG

1
ladymira avatar ladymira 5 Точки

Благодаря ви много! С double работи идеално, и наистина не е нужно кастването на Math.PI. Но не мога да си обясня защо с decimal ми дава такава грешка. Щеше да е добре, ако ги имаше тестовете, та да може да си дебъгва човек.

Предполагам че умишлено са скрити тестовете, за да може всеки да се главоблъска с домашното. Имате ли представа дали на по-късен етап ще публикуват и тестовете? Интересен ми стана този казус, защо ми даде грешка на decimal...

0
DimiTVP avatar DimiTVP 54 Точки

Пробвах твоя вариант без да каствам Math.Pi и ми казва: 

Operator '*' cannot be applied to operands of type 'double' and 'decimal'
Предполагам, че Маth.Pi е Double и за това трябва да се каства ако другите типове са ти Decimal.
0
smu4k avatar smu4k 34 Точки

Ами не, тестовете са само достъпни на Admin-и

0