Кубический корень в С++

AndrewAAndrew

Я, наверное, всех достал своими вопросами
Как выглядит функция для кубического корня в С++?
Может кто посоветует книгу, где хорошо описаны численные методы ( с листингом в С++, где-то видел такую).

psm-home

Нет такого, насколько мне известно. Чем плохо возводить число в степень 1/3.0 ?

psm-home

Судя по вопросам, тебе кроме этой книги, которую я посоветовать не могу , нужна справка по функциям C Runtime Library, связанным с математикой. Для MSVC 6 это здесь .

maggi14

не уверен, что это важно (забыл уже но я бы написал 1./3.
Или даже 0.3333333333333

Varvara2002

Да, ты забыл

psm-home

Забыл. Там всё нормально.

deestr

pow(x, 1/3);

Dasar

только про точку надо не забывать:
pow(x, 1./3);

Jackill

книжка: NUMERICAL RECIPES IN C - есть в инете

voronina

Или даже 0.3333333333333
это уже пижонстов, компилятор и так выполнит вычиления между константами.

maggi14

когда я получил такую привычку в наследство от школьного препода информатики, я еще не знал о принципах работы компиляторов

koly

Самое понтовое - это exp(ln(x)/3)

rabo

exp(ln(x)/3) - это наверное подольше будет чем pow

marriaje

Если надо быстро - лучше всего ряд написать самому

okunek

а если еще быстрее - табличку

rosali

Между прочим:
  
double __declspec(noinline) mysqrt3_v2(double x)
{
return(exp(log(x)/3.;
00401490 fld qword ptr [esp+4]
00401494 fldln2
00401496 fxch st(1)
00401498 fyl2x
0040149A fmul qword ptr [3fd5555555555555 (403120h)]
004014A0 fldl2e
004014A2 fmulp st(1st
004014A4 fld st(0)
004014A6 frndint
004014A8 fxch st(1)
004014AA fsub st,st(1)
004014AC f2xm1
004014AE fld1
004014B0 faddp st(1st
004014B2 fscale
004014B4 fstp st(1)
}
004014B6 ret
всего 355 тактов (! правда
 
double __declspec(noinline) mysqrt3_v1(double x)
{
return(pow(x,1/3.;
00401480 fld qword ptr [esp+4]
00401484 fld qword ptr [3fd5555555555555 (403120h)]
0040148A call _CIpow (401EF8h)
}
0040148F ret
вообще 344 такта, но разница не принципиальная.
Зато вот если нужно сразу скажем 5 корней сосчитать, то

x1[0] = mysqrt3_v1(2.);
x1[1] = mysqrt3_v1(3.);
x1[2] = mysqrt3_v1(4.);
x1[3] = mysqrt3_v1(6.);
x1[4] = mysqrt3_v1(7.);
//1671 такт

x2[0] = mysqrt3_v2(2.);
x2[1] = mysqrt3_v2(3.);
x2[2] = mysqrt3_v2(4.);
x2[3] = mysqrt3_v2(5.);
x2[4] = mysqrt3_v2(6.);
//753 такта
потому что вызовы pow производятся поочереди, а instrinsic exp и log конвейеризуются. А ряды и таблички вообще лесом идут, учите мат. часть!
Оставить комментарий
Имя или ник:
Комментарий: