#include <iostream>
#include <chrono>
#include <cstdint>
#include <cmath>
#include <ratio>
using namespace std;

float InvSqrt(float x){
    float xhalf = 0.5f * x;
    int i = *(int*)&x;            // store floating-point bits in integer
    i = 0x5f3759df - (i >> 1);    // initial guess for Newton's method
    x = *(float*)&i;              // convert new bits into float
    x = x*(1.5f - xhalf*x*x);     // One round of Newton's method
    return x;
}
    
int main() {
	const int32_t SampleSize = 1000000;
	int64_t Resolution = std::chrono::high_resolution_clock::period::den;
	std::cout << "Resolution: " << Resolution << std::endl;
	float Sum = 0.0f;
	auto Begin = std::chrono::high_resolution_clock::now();
	for(int32_t i=1;i<SampleSize;i++){
			Sum+=1.0f/sqrtf((float)i);
	}
	auto End = std::chrono::high_resolution_clock::now();
	std::cout << "Time Taken for 1/sqrt(i): " << (std::chrono::duration_cast<std::chrono::duration<double>>(End-Begin)).count() << " seconds. Total Sum: "  << Sum << std::endl;
	Sum = 0.0f;
	Begin = std::chrono::high_resolution_clock::now();
	for(int32_t i=1;i<SampleSize;i++){
		Sum+=InvSqrt((float)i);
	}
	End = std::chrono::high_resolution_clock::now();
	std::cout << "Time Taken for InvSqrt(i): " << (std::chrono::duration_cast<std::chrono::duration<double>>(End-Begin)).count() << " seconds. Total Sum: "  << Sum << std::endl;

	// your code goes here
	return 0;
}