Last active
November 30, 2020 05:34
-
-
Save agarmu/404462b0daba7a9c44069d75dccce90f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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