A less elegant, yet highly precise solution would have you simply convert the resultant value to a string and analyze that.
Code:
bool is_sqrt_int(double your_value) {
std::ostringstream ostr;
ostr << square_root_of(your_value);
return ostr.str().find(".") == std::string::npos;
}
[edit]
As far as calculating the square root is concerned, I prefer Newton's iteration:
Code:
result = 1
for i = 1 to N
result = (result + (value / result)) / 2
where N is the number of iterations you'd like. (The more iterations, the more precise the value, but I find just a few to be enough. Experiment yourself.)
[/edit]