#include "testlib.h" using ll = long long; const double eps = 1e-5; double parseDouble(const std::string &s, InStream &stream) { double result; // 1. sscanf로 숫자 파싱 시도 if (sscanf(s.c_str(), "%lf", &result) == 1) { return result; } // 2. sscanf 실패 시, 특수 값인지 문자열 비교 if (s == "inf" || s == "+inf" || s == "INF" || s == "+INF") return std::numeric_limits::infinity(); if (s == "-inf" || s == "-INF") return -std::numeric_limits::infinity(); if (s == "nan" || s == "NaN" || s == "NAN") return std::numeric_limits::quiet_NaN(); // 3. 숫자도 아니고 특수 값도 아니면 오류 종료 // 'stream'을 사용해 어느 파일이 문제인지 정확히 리포트 stream.quitf(_fail, "Expected double, but %s found", s.c_str()); return 0; // Unreachable } int main(int argc, char *argv[]) { registerTestlibCmd(argc, argv); ll n = inf.readLong(1, (ll)1e9); for (ll line = 1; line <= n; line++) { double j = parseDouble(ans.readToken(), ans); double p = parseDouble(ouf.readToken(), ouf); ans.readEoln(); ouf.readEoln(); if (!doubleCompare(j, p, eps)) { quitf(_wa, "%lld-th line: expected '%.7f', found '%.7f'. " "Absolute/Relative error > %.0e", line, j, p, eps); } } if (!ans.eof()) quitf(_pe, "Expected EOF in judge output, but found more data"); if (!ouf.eof()) quitf(_pe, "Expected EOF in bsb output, but found more data"); quitf(_ok, "OK: %lld lines compared within %.0e epsilon.", n, eps); }