Дистанционная подготовка: Помойму в тесте 14 ошибка с точностью
Помойму в тесте 14 ошибка с точностью
от Евгений Немченко - Среда 13 Февраль 2013, 10:58
433. Точка пересечения прямых
  Смотрите вот 3 решения, абсолютно однотипных, но почему то решение #3 проходит все тесты, а вот #2 #1 в 14 тесте WA

Начало у все решений одинаковоt, отлична концовка

Начало:
....
int det( int a1, int a2, int b1, int b2 )
{
return a1 * b2 - a2 * b1;
}
....
d = det( a1, b1, a2, b2 );
d1 = det( -c1, b1, -c2, b2 );
d2 = det( a1, -c1, a2, -c2 );
....



#1
x = (double) d1 / d ,
y = (double) d2 / d;
printf("1 %.10lf %.10lf", x, y);

#2
x = (double) d1 / d;
if ( b1 != 0 )
y = (double) ( -c1 - a1 * x ) / b1;
else
y = (double) ( -c2 - a2 * x ) / b2;
printf("1 %.10lf %.10lf", x, y);

#3
double y = (double) d2 / d;
if ( a1 != 0 )
x = (double) ( -c1 - b1 * y ) / a1
else
x = (double) ( -c2 - b2 * y ) / a2;
printf("1 %.10lf %.10lf", x, y);




Re: Помойму в тесте 14 ошибка с точностью
от Влад Жуков - Понедельник 14 Октябрь 2013, 16:18
  Та же проблема. Вероятно из соображений точности лучше проверять оба определителя
Re: Помойму в тесте 14 ошибка с точностью
от Пупка Вася - Воскресенье 26 Июль 2015, 09:53
  В тесте 14 не ошибка, а скорее всего входные данные выходят за ограничение "не больше 1000 по модулю". Соответственно det не будет больше 2000000 по модулю.

Тип int платформонезависимый - на 16 битной архитектуре - будет занимать 16 бит (приблизительно не больше 32000 по модулю).

Видно, что задача решается, если тип int заменить на тип double.

Возможно две проблемы:
1. Переполнения типа int.
2. 14 тест происходит на 16 битной платформе.

Re: Помойму в тесте 14 ошибка с точностью
от Alexey Prokopnev - Среда 29 Июль 2015, 21:17
  d1 и d2 не влезают в 32-битный тип.

1000 1000 -1000 999
-1000 -1000 999 -999

1000 1000 999 -1000
-1000 -1000 -999 999