Иногда в программе нужно вычислить кубический корень. Раньше для этой цели я пользовался парой функций логарифм-экспонента, а потом (13.05.2004) решил сделать отдельную функцию и назвал её cbrt. В результате получилась функция, которая немного быстрей и немного точней, чем exp ( log ( x ) / 3 ).
static double _cbrt ( double x )Вначале аргумент приводится к диапазону [1,8], затем вычисляется корень методом Ньютона.
{
double s = 1.;
while ( x < 1. )
{
x *= 8.;
s *= 0.5;
}
while ( x > 8. )
{
x *= 0.125;
s *= 2.;
}
double r = 1.5;
for ( int i = 6; --i >= 0; )
{
r -= 1./3. * ( r - x / ( r * r ) );
}
return r * s;
}
double cbrt ( double x )
{
if ( x > 0 ) return _cbrt ( x ); else
if ( x < 0 ) return-_cbrt (-x ); else
return 0.;
}
