Skip to content

Instantly share code, notes, and snippets.

@agarmu
Last active November 30, 2020 05:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save agarmu/404462b0daba7a9c44069d75dccce90f to your computer and use it in GitHub Desktop.
Save agarmu/404462b0daba7a9c44069d75dccce90f to your computer and use it in GitHub Desktop.
// must use gcc ¯\_(ツ)_/¯
#include <bits/stdc++.h>
using namespace std;
int closestSquare(int num) {
double root = sqrt((double)num);
double lowerBoundRoot = (int)(root);
double upperBoundRoot = (int)(root + 0.5);
int lowerBound = lowerBoundRoot * lowerBoundRoot;
int upperBound = upperBoundRoot * upperBoundRoot;
int distanceLower = abs(lowerBound - num);
int distanceUpper = abs(upperBound - num);
if (distanceLower <= distanceUpper) {
return lowerBound;
} else {
return upperBound;
}
}
int main(int argc, char const *argv[])
{
int n, squareNear;
double realSqrt, squareRootOfNearSquare, generatedSqrt;
if (argc == 1) {
while(true) {
cout << "Enter a number: ";
cin >> n;
int squareNear = closestSquare(n);
realSqrt = sqrt((double)n);
squareRootOfNearSquare = sqrt((double)squareNear);
generatedSqrt = ((double)(n + squareNear))/(2.0 * squareRootOfNearSquare);
cout << "Real Square root: " << realSqrt;
cout << "\nSquare root generated: " << generatedSqrt;
cout << "\nDifference: " << generatedSqrt - realSqrt << endl;
}
} else if (argc == 2) {
stringstream val(argv[1]);
val >> n;
squareNear = closestSquare(n);
realSqrt = sqrt((double)n);
squareRootOfNearSquare = sqrt((double)squareNear);
generatedSqrt = ((double)(n + squareNear))/(2.0 * squareRootOfNearSquare);
cout << "Real Square root: " << realSqrt;
cout << "\nSquare root generated: " << generatedSqrt;
cout << "\nDifference: " << generatedSqrt - realSqrt << endl;
} else if (argc == 3) {
stringstream begin(argv[1]);
stringstream finish(argv[2]);
int start, end;
begin >> start;
finish >> end;
if (start > end) {
cout << "Sorry, you started before you ended." << endl;
return 2;
}
double sumAbsDeviation, sumDeviationSquared, absDeviation, deviation;
int maxDevNum, minDevNum;
double maxDev = 0;
double minDev = 1;
double numSamples = (end-start+1); // is an int, but cast as double for convenience
for (int n = start; n <= end; n++) {
squareNear = closestSquare(n);
realSqrt = sqrt((double)n);
squareRootOfNearSquare = sqrt((double)n);
generatedSqrt = ((double)(n + squareNear))/(2.0 * squareRootOfNearSquare);
deviation = generatedSqrt - realSqrt;
absDeviation = abs(deviation);
if (absDeviation > maxDev) {
maxDev = absDeviation;
maxDevNum = n;
}
if (absDeviation > 0 && absDeviation < minDev) {
minDev = absDeviation;
minDevNum = n;
}
if(n % 30 == 0) {
cout << "\r" << n;
}
/*cerr << "(" << n << ")\t";
cerr.precision(3);
cerr << realSqrt << "\t" << generatedSqrt << "\t" << deviation << "\n";
if (n % 20 == 0) {
cout.flush();
}
sumAbsDeviation += absDeviation;
sumDeviationSquared += absDeviation * absDeviation;*/
}
cerr << endl;
cout.precision(10);
cout << "Average deviation: " << sumAbsDeviation/numSamples << "\n";
cout << "RMSE (Root Mean Squared Error): " << sqrt(sumDeviationSquared/numSamples) << "\n";
cout << "Maximum deviation (at " << maxDevNum << "): " << maxDev << "\n";
cout << "Minimum non-zero deviation (at " << minDevNum << "): " << minDev << "\n";
cout << endl;
} else {
cout << "Sorry, there was an error." << endl;
return 1;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment