#include <string>
#include <iostream>
#include <cmath>
#include <stdexcept>

double string_to_double(std::string s, unsigned short radix)
{
    std::size_t decimal_pos = s.find('.');
    int decimals = 0;
    if(decimal_pos != std::string::npos)
    {
        s.erase(decimal_pos, 1);
        decimals = s.size() - decimal_pos;
    }
    size_t errpos;
    double answer = stoll(s, &errpos, radix) / std::pow(radix, decimals);;
    if(errpos < s.size())
        throw std::invalid_argument("parse error in string_to_double");
    return answer;
}
int main()
{
    std::cout << string_to_double("10.A",16) << '\n'
              << string_to_double("1001.1",2) << '\n'
              << string_to_double("123.4",10) << '\n'
              << string_to_double("-.123",10) << '\n'
              << string_to_double("abc",16) << '\n'
              << string_to_double("111",2) << '\n';

}
