large large::operator-( const large& v ) const { if( v == 0 ) return *this; if( _neg != v._neg ) return ( *this + (-v) ); if( compare_abs(v) < 0 ) return -( v - *this ); large r = *this; word_t k = 1, w; for( size_t i = 0; i < r._val.size(); i++ ) { if( i < v._val.size() ) { dword_t d = (dword_t) r._val[i] - v._val[i] + k + _MAXWORD; w = dword_lo(d); k = dword_hi(d); } else { if( k == 1 ) break; dword_t d = (dword_t) r._val[i] + k + _MAXWORD; w = dword_lo(d); k = dword_hi(d); } r._val[i] = w; } r.normalize(); return r; }
void smooth_value_field::tick(double delta_seconds) { double averaging_constant = pow(smoothing_average_factor, averages_per_sec * delta_seconds); auto calculated_smoothed_value = value * averaging_constant + target_value * (1.0 - averaging_constant); if (calculated_smoothed_value.compare_abs(target_value, 1.f)) calculated_smoothed_value = target_value; value = calculated_smoothed_value; discrete_value = value; }