Имеются посылки по A (div. 2) с использованием компилятором GNU C++, отличаются только в одной строке спецификатором вывода:
http://www.codeforces.ru/contest/127/submission/844205
Обе посылки дают WA#1. Компилил у себя g++ -ом код второй посылки -- программа выдаёт правильный ответ на тест #1.
Аналогичная посылка с MS C++ даёт AC:
Очевидно проблема в выводе long double. Подскажите, как правильно вводить/выводить long double с использованием printf местным g++ ? Есть ли способ без преобразования в double?
long double a;
...
printf("%.10lf", (double)a);
AFAIK, нет.
Но обычно при выводе особо большую точность не требуют, потому можно считать всё в long double и выводить как double.
printf("%Lf", answ);
Мы с этим приколом 2 года назад в Харькове столкнулись. Даже реджадж хотели требовать.
Не вышло ответить куда хотел.
To anonymous:
Вот именно, в MS С++ sizeof(double)==8, а в g++ sizeof(long double)>8, поэтому считаю g++ предпочтительней в задачах, где применяется арифметика с плавающей точкой.
Из известного мне. Участниками CF найдено 2 бага в gcc и 0 багов в MS VCPP. IDE для MS VCPP значительно лучше (можно VS приучить к gcc? не думаю). Таким образом, отправка на gcc стоит мне лишних пары минут для того, чтобы скомпилировать под ней решение (на стороне сервера, заодно с макс-тестом), и область применения ограничена близкими к ТЛ случаями (оптимизатор на gcc лучше).
P.S. сравнивать sizeof в разных С++ компиляторах - не по стандарту. sizeof(long double) == 2 может быть для 160-битного типа long double.
Касаемо глюков - в VCPP мы как-то наталкивались на веселый спецэффект, когда оптимизатор вообще вырезал функцию, обновляющую что-то в дереве отрезков. Так и не поняли, почему она ему не нравится.
P.S. Ни в коем случае не ругаю VCPP - просто везде есть баги, да. А IDE в VS отменная. В частности, нравится тем, что не особо тормозит даже на древних компах :-)
Видимо никаких нормально работающих спецификаторов для long double нет. Для вывода проще всего выводить приводя к double как написано выше. А для ввода я обычно пишу так:
Обычно, если требуется большая точность вывода, то самого вывода мало, так что std::cout в помощь - он для всех типов корректно выводит. Используйте cout.setprecision(20); cout << fixed; - для того чтобы много знаков после точки выводить.
Сам любитель printf, но в случае long double можно и поступиться.
Правда? cout умеет выводить long double в G++? попробуйте, иначе бы не было таких вопросов
Умеет
В специфических версиях gcc на специфических для него платформах (windows) имеется баг с выводом. Но это не значит что gcc не умеет.
4 года назад, когда писался комментарий, этой бажной версии ещё не существовало.
Вы говорите про MinGW (у него, да, есть несколько бажных версий) или про G++?