Проблема с типом данных при вычислении площади треугольника

243
13 июля 2017, 01:29

Здравствуйте, решаю задачку для олимпиады.

Написал код, но выдаёт что не верный результат, думаю проблема в типе данных.(Проверять размерность данных и т.п. через if и так далее - не нужно)

#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    double a,b,c, S, P,p, R;
    cin >> a;
    cin >> b;
    cin >> c;
    P = a + b + c;
    p = P / 2;
    S = sqrt(p*(p - a)*(p - b)*(p - c));
    R = sqrt(((p - a)*(p - b)*(p - c)) / p);
    cout << P << " "<<S<<" "<<R;
    return 0;
}
Answer 1

Не стоит использовать формулу Герона для подсчёта площади - она приводит к переполнению или очень большой погрешности. Тебе гарантировали, что площадь не превосходит 9223372036854775807, но ты-то считаешь квадрат этого числа.

Если ничего не путаю, стоит воспользоваться теоремой синусов или косинусов.

Кроме того, надо использовать тип long double (или более точный) для всех данных и компилятор gcc (не Visual Studio). Число, указанное в качестве ограничения, это 263-1. У обычного double есть только 53 значащих бита, чего не хватит даже для точного считывания входных данных.

READ ALSO
вопрос по QThreadPool

вопрос по QThreadPool

Использую QThreadPool, делаю setMaxThreadCount(10), ошибок нету, все работает, только потоков в тредпуле все равно 4(количество ядер на машине), понять совершенно...

249
Какие плюсы и минусы использования goto?

Какие плюсы и минусы использования goto?

Предположим, у меня есть следующая конструкция:

271
OpenOCD error: gdb requested a non-existing register

OpenOCD error: gdb requested a non-existing register

Добрый день! Прошу помочь разобраться с проблемойПытаюсь настроить отладчик (gdb 8

313