194{
195 if (tok.empty()) return std::numeric_limits<double>::quiet_NaN();
196 std::string lower(tok.size(), '\0');
197 std::transform(tok.begin(), tok.end(), lower.begin(),
198 [](unsigned char c) { return static_cast<char>(std::tolower(c)); });
199 if (lower == "nan") return std::numeric_limits<double>::quiet_NaN();
200 try {
201 const double v = std::stod(tok);
202 if (!std::isfinite(v)) return std::numeric_limits<double>::quiet_NaN();
203 return v;
204 } catch (...) {
205 return std::numeric_limits<double>::quiet_NaN();
206 }
207}