#pragma once #include "gp_config.hpp" #include "gp/algorithms/repeat.hpp" namespace gp { template T lerp(T input, T low, T high) { return low + (high - low) * input; } template T lextrap(T input, T low, T high) { return (input - low) / (high - low); } template T fixed_sqrt(T value) { gp_config::assertion(value >= 0, "trying to compute square root of negative number"); if(value == 0) return 0; T ret = value / 2; T tmp; gp::repeat(fixed_passes, [&](){ tmp = ret; ret = (value / tmp + tmp) / 2; }); return ret; } template T epsilon_sqrt(T value) { gp_config::assertion(value >= 0, "trying to compute square root of negative number"); if(value == 0) return 0; T ret = value / 2; T tmp; constexpr T epsilon = gp_config::rendering::epsilon; size_t cnt = 0; while( !( (ret+epsilon)*ret > value && (ret-epsilon)*ret < value ) && cnt < cap_passes ){ tmp = ret; ret = (value / tmp + tmp) / 2; ++cnt; }; return ret; } template T stable_sqrt(T value) { gp_config::assertion(value >= 0, "trying to compute square root of negative number"); if(value == 0) return 0; T ret = value / 2; T tmp; while(ret != tmp){ tmp = ret; ret = (value / tmp + tmp) / 2; }; return ret; } }