#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;
}