Hitung akar pangkat tiga dari suatu angka


12

Tujuan golf kode ini adalah untuk membuat program atau fungsi yang menghitung dan mengeluarkan akar pangkat tiga dari angka yang diberikan sebagai input.
Aturan:

  • Tidak ada sumber daya eksternal
  • Tidak menggunakan fungsi akar pangkat tiga bawaan.
  • Tidak menggunakan metode / operator yang dapat meningkatkan angka ke daya (yang mencakup akar kuadrat, akar ke-4, dll.).
  • Fungsi / program Anda harus dapat menerima angka titik-mengambang dan angka negatif sebagai input.
  • Jika akar pangkat tiga adalah angka floating-point, maka bulatkan ke 4 angka setelah titik desimal.
  • Ini adalah kode golf, kode terpendek dalam byte menang.

Kasus uji:

27 --> 3
64 --> 4
1  --> 1
18.609625 --> 2.65
3652264 --> 154
0.001 --> 0.1
7  --> 1.9129

Anda dapat menggunakan semua kasus uji di atas untuk menguji angka negatif ( -27 --> -3, -64 --> -4...)


sial, jika Anda hanya mengizinkan angka dengan kubus yang tepat, saya akan memiliki golf yang bagus
yo '

1
Menilai dari kasus pengujian Anda, saya menganggap program hanya perlu berurusan dengan bilangan real?
user12205

@ace menambahkan kompleks dan saya mengubah 2 huruf dalam kode saya;)
yo

2
Apakah pembulatan menjadi 4 digit setelah titik desimal merupakan persyaratan yang kuat? Atau mungkinkah sesuatu seperti "Anda tidak diharuskan menunjukkan lebih dari 4 digit setelah titik desimal"?
Victor Stafusa

Dengan merujuk pada jawaban saya menggunakan Exp (ln (x) / 3) (dan beberapa klon darinya) mohon klarifikasi jika Exp diizinkan. Saya berasumsi pow (x, 1/3) tidak (meskipun secara teknis bukan fungsi root cube.)
Level River St

Jawaban:


6

J: 16 karakter

Terjemahan Haskell yang longgar:

-:@((%*~)+])^:_~

Kasus uji:

   -:@((%*~)+])^:_~27
3
   -:@((%*~)+])^:_~64
4
   -:@((%*~)+])^:_~1
1
   -:@((%*~)+])^:_~18.609625
2.65
   -:@((%*~)+])^:_~3652264
154
   -:@((%*~)+])^:_~0.001
0.1
   -:@((%*~)+])^:_~7
1.91293

Ini berfungsi seperti ini:

     (-:@((% *~) + ])^:_)~ 27
↔ 27 (-:@((% *~) + ])^:_) 27
↔ 27 (-:@((% *~) + ])^:_) 27 (-:@((% *~) + ])) 27
↔ 27 (-:@((% *~) + ])^:_) -: ((27 % 27 * 27) + 27)
↔ 27 (-:@((% *~) + ])^:_) 13.5185
↔ 27 (-:@((% *~) + ])^:_) 27 (-:@((% *~) + ])) 13.5185
↔ 27 (-:@((% *~) + ])^:_) -: ((27 % 13.5185 * 13.5185) + 13.5185)
↔ 27 (-:@((% *~) + ])^:_) 6.83313
...

Dalam kata kata:

half =. -:
of =. @
divideBy =. %
times =. *
add =. +
right =. ]
iterate =. ^:
infinite =. _
fixpoint =. iterate infinite
by_self =. ~

-:@((%*~)+])^:_~ ↔ half of ((divideBy times by_self) add right) fixpoint by_self

Bukan salah satu terjemahan bertele-tele terbaik, karena ada garpu diad dan ~hak di akhir.


19

Haskell - 35

c n=(iterate(\x->(x+n/x/x)/2)n)!!99

Contoh berjalan:

c 27  =>  3.0
c 64  =>  4.0
c 1  =>  1.0
c 18.609625  =>  2.6500000000000004  # only first 4 digits are important, right?
c 3652264  =>  154.0
c 0.001  =>  0.1
c 7  =>  1.9129311827723892
c (-27)  =>  -3.0
c (-64)  =>  -4.0

Selain itu, jika Anda mengimpor Data.Complex, itu bahkan berfungsi pada bilangan kompleks, ia mengembalikan salah satu akar bilangan (ada 3):

c (18:+26)  =>  3.0 :+ 1.0

The :+Operator harus dibaca sebagai 'ditambah i kali'


1
Ini layak diberi +1. Saya telah refactoring general algs root selama satu jam terakhir, dan saya baru saja tiba pada hasil yang sama. Bravo.
primo

@ primo Saya langsung mengingat semua algoritma pendekatan akar ke-n, dan setelah menyerah pada seri Taylor / Maclaurin di APL saya menggunakan ini.
mniip

Dengan menggunakan metode Newton yang saya x=(2*x+n/x/x)/3dapat, dapatkah Anda menjelaskan mengapa Anda dapat menggunakannya x=(x+n/x/x)/2? Konvergen lebih lambat tapi saya tidak bisa menjelaskan mengapa konvergen ...
Michael M.

@Michael karena jika Anda mengambil x=cbrt(n), maka x=(x+n/x/x)/2itu benar. Jadi, apakah itu benar untuk ekspresimu
mniip

@ Michael Saya sampai di sini dengan cara ini: codepad.org/gwMWniZB
primo

7

SageMath, (69) 62 byte

Namun, jangan pernah percaya itu akan memberi Anda hasilnya, sangat sulit untuk melewati semua angka secara acak:

def r(x):
 y=0
 while y*y*y-x:y=RR.random_element()
 return "%.4f"%y

jika Anda tidak bersikeras memotong:

def r(x):
 y=0
 while y*y*y-x:y=RR.random_element()
 return y

SageMath, 12 byte, jika expdiizinkan

Berfungsi untuk semua hal: positif, negatif, nol, kompleks, ...

exp(ln(x)/3)

Saya yakin Anda menggunakan operator yang dapat menaikkan angka menjadi daya.
user12205

ah ok, benar, diedit
yo '

6
+1 untuk algoritme bodoh yang monumental yang masih memenuhi persyaratan.
Siput mekanik

@Mechanicalsnail Terima kasih. Saya harap jelas bahwa apa yang saya lakukan adalah semacam resesi: D Namun, jika expdiizinkan, saya turun ke 12 dan tidak bodoh sama sekali :)
yo

Menimbang bahwa expkependekan dari "fungsi eksponensial", yaitu "fungsi yang nilainya adalah konstanta dinaikkan ke kekuatan argumen, terutama fungsi di mana konstanta adalah e.", Dan ada "Tidak ada penggunaan metode / operator yang dapat menaikkan angka ke daya ", exptidak diizinkan.
mbomb007

5

Python - 62 byte

x=v=input()
exec"x*=(2.*v+x*x*x)/(v+2*x*x*x or 1);"*99;print x

Mengevaluasi ke presisi titik mengambang penuh. Metode yang digunakan adalah metode Halley . Karena setiap iterasi menghasilkan 3 kali lebih banyak digit yang benar daripada yang terakhir, 99 iterasi sedikit berlebihan.

Input output:

27 -> 3.0
64 -> 4.0
1 -> 1.0
18.609625 -> 2.65
3652264 -> 154.0
0.001 -> 0.1
7 -> 1.91293118277
0 -> 1.57772181044e-30
-2 -> -1.25992104989

Bagaimana cara kerjanya?
justhalf

1
@ justhalf Saya pikir ini adalah metode pendekatan Newton pada dasarnya.
yo '

Btw, gagal pada0
yo '

Gagal -2, maaf untuk itu.
yo

3
@ plg Deskripsi masalah melarang penggunaan fungsi eksponensial apa pun, jika tidak v**(1/.3)akan menjadi pemenang yang pasti.
primo

3

Javascript (55)

function f(n){for(i=x=99;i--;)x=(2*x+n/x/x)/3;return x}

BONUS, formulasi umum untuk semua akar
function f(n,p){for(i=x=99;i--;)x=x-(x-n/Math.pow(x,p-1))/p;return x}

Untuk root cube, cukup gunakan f(n,3), root kuadrat f(n,2), dll ... Contoh: f(1024,10)mengembalikan 2.

Penjelasan
Berdasarkan metode Newton:

Cari f(x) = x^3 - n = 0:, solusinya adalah n = x^3
Derivasi:f'(x) = 3*x^2

Pengulangan :
x(i+1) = x(i) - f(x(i))/f'(x(i)) = x(i) + (2/3)*x + (1/3)*n/x^2

Tes

[27,64,1,18.609625,3652264,0.001,7].forEach(function(n){console.log(n + ' (' + -n + ') => ' + f(n) + ' ('+ f(-n) +')')})

27 (-27) => 3 (-3)
64 (-64) => 4 (-4)
1 (-1) => 1 (-1)
18.609625 (-18.609625) => 2.65 (-2.65)
3652264 (-3652264) => 154 (-154)
0.001 (-0.001) => 0.09999999999999999 (-0.09999999999999999)
7 (-7) => 1.912931182772389 (-1.912931182772389) 

Satu karakter lebih pendek:function f(n){for(i=x=99;i--;)x-=(x-n/x/x)/3;return x}
salin

Dapat direduksi menjadi 47 bytef=(n)=>eval('for(i=x=99;i--;)x=(2*x+n/x/x)/3')
Luis felipe De jesus Munoz

2

PHP - 81 byte

Solusi berulang:

$i=0;while(($y=abs($x=$argv[1]))-$i*$i*$i>1e-4)$i+=1e-5;@print $y/$x*round($i,4);

Apa yang terjadi jika mencoba menghitung akar pangkat tiga dari nol?
Victor Stafusa

Ini hanya akan menampilkan "0" (terima kasih kepada operator penekan kesalahan - "@").
Razvan

1
0.0001dapat digantikan oleh 1e-4dan 0.00001oleh 1e.5.
ComFreek

Ini membutuhkan PHP <7 ( 0/0berikan NANdalam PHP 7). $i=0;tidak perlu (-5 byte. Jika tidak, forakan menghemat satu byte.) Ruang setelah printtidak diperlukan (-1 byte). -Rdapat menghemat 3 byte dengan $argn.
Titus

Simpan sepasang paranthes dengan while(1e-4+$i*$i*$i<$y=abs($x=$argn))(-2 byte).
Titus

2

Perl, 92 byte

sub a{$x=1;while($d=($x-$_[0]/$x/$x)/3,abs$d>1e-9){$x-=$d}$_=sprintf'%.4f',$x;s/\.?0*$//;$_}
  • Fungsi amengembalikan string dengan nomor tanpa bagian fraksi yang tidak perlu atau nol yang tidak signifikan di ujung kanan.

Hasil:

              27 --> 3
             -27 --> -3
              64 --> 4
             -64 --> -4
               1 --> 1
              -1 --> -1
       18.609625 --> 2.65
      -18.609625 --> -2.65
         3652264 --> 154
        -3652264 --> -154
           0.001 --> 0.1
          -0.001 --> -0.1
               7 --> 1.9129
              -7 --> -1.9129
 0.0000000000002 --> 0.0001
-0.0000000000002 --> -0.0001
               0 --> 0
              -0 --> 0

Dihasilkan oleh

sub test{
    my $a = shift;
    printf "%16s --> %s\n", $a, a($a);
    printf "%16s --> %s\n", "-$a", a(-$a);
}
test 27;
test 64;
test 1;
test 18.609625;
test 3652264;
test 0.001;
test 7;
test "0.0000000000002";
test 0;

Perhitungan didasarkan pada metode Newton :

Perhitungan


2

APL - 31

(×X)×+/1,(×\99⍴(⍟|X←⎕)÷3)÷×\⍳99

Menggunakan fakta bahwa cbrt(x)=e^(ln(x)/3), tetapi bukannya melakukan eksponensial naif , itu menghitung e^xmenggunakan seri Taylor / Maclaurin.

Sampel berjalan:

⎕: 27
3
⎕: 64
4
⎕: 1
1
⎕: 18.609625
2.65
⎕: 3652264
154
⎕: 0.001
0.1
⎕: 7
1.912931183
⎕: ¯27
¯3
⎕: ¯7
¯1.912931183

Melihat ada jawaban J dalam 16 karakter, saya pasti sangat buruk di APL ...


2

Jawa, 207 182 181

Kadang-kadang ketika saya bermain golf, saya memiliki dua bir dan bermain sangat buruk

class n{public static void main(String[]a){double d=Double.valueOf(a[0]);double i=d;for(int j=0;j<99;j++)i=(d/(i*i)+(2.0*i))/3.0;System.out.println((double)Math.round(i*1e4)/1e4);}}

Metode Pendekatan Iteratif Newton, menjalankan 99 iterasi.

Inilah yang belum disatukan:

class n{
    public static void main(String a[]){
        //assuming the input value is the first parameter of the input
        //arguments as a String, get the Double value of it
        double d=Double.valueOf(a[0]);
        //Newton's method needs a guess at a starting point for the 
        //iterative approximation, there are much better ways at 
        //going about this, but this is by far the simplest. Given
        //the nature of the problem, it should suffice fine with 99 iterations
        double i=d;

        //make successive better approximations, do it 99 times
        for(int j=0;j<99;j++){
            i=( (d/(i*i)) + (2.0*i) ) / 3.0;
        }
        //print out the answer to standard out
        //also need to round off the double to meet the requirements
        //of the problem.  Short and sweet method of rounding:
        System.out.println( (double)Math.round(i*10000.0) / 10000.0 );
    }
}

1
Anda dapat mengubah nama argsvariabel menjadi seperti z, mengurangi 6 karakter. Anda dapat menghapus ruang dan kurung kurawal di badan for-loop, mengurangi 3 karakter. Anda dapat mengganti 10000.0dengan 1e4, mengurangi 6 karakter. Kelas tidak perlu bersifat publik, sehingga Anda dapat mengurangi lebih dari 7 karakter. Dengan cara ini akan dikurangi menjadi 185 karakter.
Victor Stafusa

Apakah para pemain di akhir benar-benar diperlukan? Itu bukan untuk saya.
Victor Stafusa

@ Viktor Terima kasih untuk mata yang baik, penggunaan notasi E untuk 10000.0 ganda adalah ide yang sangat bagus. Dengan desain pertanyaan, saya pikir itu sah untuk membuat metode ini daripada kelas cli yang berfungsi, yang akan mengurangi ukuran jauh. Dengan Java, saya tidak berpikir saya punya kesempatan, jadi saya keliru di sisi fungsional.
md_rasler

Selamat datang di CodeGolf! Jangan lupa untuk menambahkan penjelasan dalam jawaban tentang cara kerjanya!
Justin

@ Quincunx, Terima kasih, membuat perubahan yang disarankan.
md_rasler

2

TI-Basic, 26 24 byte

Input :1:For(I,1,9:2Ans/3+X/(3AnsAns:End

Itu langsung menggunakan ^operator, bukan. Itu dilarang oleh aturan
mniip

@mniip: Apakah e^ada satu operator pada seri TI-83? Saya tidak ingat. Either way, itu melanggar semangat aturan.
Mekanik siput

@Mechanicalsnail Tidak masalah saya akan mengatakan. Dalam sebagian besar bahasa, Anda bisa melakukannya exp(ln(x)/3)atau e^(ln(x/3))jika Anda mengizinkan salah satu dari kedua bahasa ini. Tapi entah bagaimana saya mengerti exp(ln(x)/a)terlalu banyak setara dengan yang x^(1/a)diizinkan oleh aturan: - /
yo

Fungsi eksponensial: "suatu fungsi yang nilainya adalah konstanta dinaikkan ke kekuatan argumen , terutama fungsi di mana konstanta adalah e." ... "Tidak ada penggunaan metode / operator yang dapat meningkatkan angka menjadi kekuatan"
mbomb007

Terima kasih atas tangkapan @ mbomb007, saya menulis jawaban ini lebih dari 3 tahun yang lalu dan saya akan memperbaikinya untuk mematuhi sekarang.
Timtech

2

Js 57 byte

f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')

f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')
document.getElementById('div').innerHTML += f(-27) + '<br>'
document.getElementById('div').innerHTML += f(-64) + '<br>'
document.getElementById('div').innerHTML += f(-1) + '<br>'
document.getElementById('div').innerHTML += f(-18.609625) + '<br>'
document.getElementById('div').innerHTML += f(-3652264) + '<br>'
document.getElementById('div').innerHTML += f(-0.001) + '<br>'
document.getElementById('div').innerHTML += f(-7) + '<br><hr>'
document.getElementById('div').innerHTML += f(27) + '<br>'
document.getElementById('div').innerHTML += f(64) + '<br>'
document.getElementById('div').innerHTML += f(1) + '<br>'
document.getElementById('div').innerHTML += f(18.609625) + '<br>'
document.getElementById('div').innerHTML += f(3652264) + '<br>'
document.getElementById('div').innerHTML += f(0.001) + '<br>'
document.getElementById('div').innerHTML += f(7) + '<br>'
<div id="div"></div>


2

Javascript: 73/72 karakter

Algoritma ini lumpuh, dan mengeksploitasi fakta bahwa pertanyaan ini dibatasi hingga 4 digit setelah titik desimal. Ini adalah versi modifikasi dari algoritma yang saya sarankan di kotak pasir untuk tujuan pengerjaan ulang pertanyaan. Itu dihitung dari nol hingga tak terbatas h*h*h<a, hanya dengan trik perkalian dan pembagian untuk menangani pecahan 4 angka desimal.

function g(a){if(a<0)return-g(-a);for(h=0;h*h*h<1e12*a;h++);return h/1e4}

Sunting, 4 tahun kemudian: Seperti yang disarankan oleh Luis felipe De jesus Munoz, dengan menggunakan **kode lebih pendek, tetapi fitur itu tidak tersedia pada tahun 2014 ketika saya menulis jawaban ini. Bagaimanapun, dengan menggunakannya, kami mencukur karakter tambahan:

function g(a){if(a<0)return-g(-a);for(h=0;h**3<1e12*a;h++);return h/1e4}

1
Sebaliknya, h*h*hAnda dapat melakukan h**3dan menghemat 1 byte
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz Jawaban ini berasal dari 2014. **Operator ini diusulkan pada 2015 dan diterima sebagai bagian dari ECMAScript 7 pada 2016. Jadi, pada saat saya menulis itu, tidak ada **bahasa.
Victor Stafusa

1

Javascript - 157 karakter

Fungsi ini:

  • Tangani angka negatif.
  • Tangani angka-angka yang mengambang.
  • Jalankan dengan cepat untuk nomor input apa pun.
  • Memiliki ketelitian maksimum yang diizinkan untuk angka javascript floating-point.
function f(a){if(p=q=a<=1)return a<0?-f(-a):a==0|a==1?a:1/f(1/a);for(v=u=1;v*v*v<a;v*=2);while(u!=p|v!=q){p=u;q=v;k=(u+v)/2;if(k*k*k>a)v=k;else u=k}return u}

Versi yang dijelaskan Ungolfed:

function f(a) {
  if (p = q = a <= 1) return a < 0 ? -f(-a)      // if a < 0, it is the negative of the positive cube root.
                           : a == 0 | a == 1 ? a // if a is 0 or 1, its cube root is too.
                           : 1 / f (1 / a);      // if a < 1 (and a > 0) invert the number and return the inverse of the result.

  // Now, we only need to handle positive numbers > 1.

  // Start u and v with 1, and double v until it becomes a power of 2 greater than the given number.
  for (v = u = 1; v * v * v < a; v *= 2);

  // Bisects the u-v interval iteratively while u or v are changing, which means that we still did not reached the precision limit.
  // Use p and q to keep track of the last values of u and v so we are able to detect the change.
  while (u != p | v != q) {
    p = u;
    q = v;
    k = (u + v) / 2;
    if (k * k * k > a)
      v=k;
    else
      u=k
  }

  // At this point u <= cbrt(a) and v >= cbrt(a) and they are the closest that is possible to the true result that is possible using javascript-floating point precision.
  // If u == v then we have an exact cube root.
  // Return u because if u != v, u < cbrt(a), i.e. it is rounded towards zero.
  return u
}

1

PHP, 61

Berdasarkan metode Newton. Versi Michael jawaban yang sedikit dimodifikasi :

for($i=$x=1;$i++<99;)$x=(2*$x+$n/$x/$x)/3;echo round($x,14);

Ia bekerja dengan angka negatif, dapat menangani angka floating point, dan membulatkan hasilnya menjadi 4 angka setelah titik desimal jika hasilnya adalah angka floating point.

Demo kerja


Anda dapat menyimpan dua byte dengan for($x=1;++$i<100;).... Tetapi menggunakan variabel yang telah ditetapkan sebagai input umumnya disukai . Penggunaan yang lebih baik $argv[1]atau $argn.
Titus

1

Befunge 98 - Pekerjaan sedang berlangsung

Bahasa ini tidak mendukung angka floating point; ini mencoba untuk meniru mereka. Saat ini berfungsi untuk angka positif yang tidak dimulai dengan 0setelah titik desimal (kebanyakan). Namun, itu hanya menghasilkan 2 tempat desimal.

&5ka5k*&+00pv
:::**00g`!jv>1+
/.'.,aa*%.@>1-:aa*

Ia bekerja dengan memasukkan bagian sebelum titik desimal, mengalikannya dengan 100000, kemudian memasukkan bagian setelah titik dan menambahkan dua angka bersamaan. Baris kedua melakukan penghitung sampai kubus lebih besar dari angka yang dimasukkan. Kemudian baris ketiga mengekstrak angka desimal dari bilangan bulat.

Jika ada yang bisa memberi tahu saya mengapa baris ketiga hanya dibagi 100untuk mendapatkan nilai yang benar, tolong beri tahu saya.

IO:

27.0       3 .0
64.0       4 .0
1.0        1 .0
18.609625  2 .65
0.001      0 .1
7.0        1 .91

0.1        0 .1

1

Smalltalk, 37

kredit jatuh ke mniip untuk algoritme; Versi Smalltalk dari kodenya:

masukan dalam n; output dalam x:

1to:(x:=99)do:[:i|x:=2*x+(n/x/x)/3.0]

atau, sebagai blok

[:n|1to:(x:=99)do:[:i|x:=2*x+(n/x/x)/3.0].x]

1

Bahasa GameMaker, 51 byte

for(i=x=1;i++<99;1)x=(2*x+argument0/x/x)/3;return x

0

Haskell: 99C

Tidak bisa mengalahkan @mniip dalam kepintaran. Saya hanya pergi dengan pencarian biner.

c x=d 0 x x
d l h x
 |abs(x-c)<=t=m
 |c < x=d m h x
 |True=d l m x
 where m=(l+h)/2;c=m*m*m;t=1e-4

Tidak Disatukan:

-- just calls the helper function below
cubeRoot x = cubeRoot' 0 x x

cubeRoot' lo hi x
    | abs(x-c) <= tol = mid           -- if our guess is within the tolerance, accept it
    | c < x = cubeRoot' mid hi x      -- shot too low, narrow our search space to upper end
    | otherwise = cubeRoot' lo mid x  -- shot too high, narrow search space to lower end
    where
        mid = (lo+hi)/2
        cubed = mid*mid*mid
        tol = 0.0001

Anda dapat menggunakan operator infiks untuk d(suka (l#h)x) untuk menyimpan byte untuk setiap panggilan. ckemudian menjadi id>>=(0#).
Buah Esolanging

Anda dapat menghapus spasi di sekitar c < x.
Buah Esolanging

Anda bisa menggunakan 1>0bukan True.
Buah Esolanging

0

J 28

*@[*(3%~+:@]+(%*~@]))^:_&|&1

Menggunakan metode Newtons, menemukan akar dari x^3 - Xlangkah pembaruan adalah x - (x^3 - C)/(3*x^2), di mana x adalah dugaan saat ini, dan C input. Melakukan perhitungan matematika yang satu ini menghasilkan ekspresi sederhana yang sangat sederhana (2*x+C/x^2) /3. Perawatan harus diambil untuk angka negatif.

Diimplementasikan dalam J, dari kanan ke kiri:

  1. | Ambil abs dari kedua argumen, teruskan
  2. ^:_ Lakukan sampai konvergensi
  3. (%*~@])adalah C / x^2( *~ ysetara dengan y * y)
  4. +:@] adalah 2 x
  5. 3%~mempertiga. Ini menghasilkan akar positif
  6. *@[ * positive_root mengalikan akar positif dengan signum C.

Uji coba:

   NB. give it a name:
   c=: *@[*(3%~+:@]+(%*~@]))^:_&|&1
   c 27 64 1 18.609625 3652264 0.001 7
3 4 1 2.65 154 0.1 1.91293

0

AWK, 53 byte

{for(n=x=$1;y-x;){y=x;x=(2*x+n/x/x)/3}printf"%.4g",y}

Contoh penggunaan:

$ awk '{for(n=x=$1;y-x;){y=x;x=(2*x+n/x/x)/3}printf"%.4g",y}' <<< 18.609625 
2.65$

Terima kasih buka @Mig untuk JavaScriptsolusi dari mana ini berasal. Ini berjalan sangat cepat mengingat bahwa forloop membutuhkan iterasi untuk berhenti berubah.


0

C, 69 byte

i;float g(float x){for(float y=x;++i%999;x=x*2/3+y/3/x/x);return x;}

Hanya implementasi lain dari metode Newton. Cobalah online!


0

Stax , 10 byte CP437

╘♀┘A╕äO¶∩'

Jalankan dan debug online!

Penjelasan

Gunakan versi yang belum dibongkar untuk menjelaskan.

gpJux*_+h4je
gp              Iterate until a fixed point is found, output the fix point
  Ju            Inverse of square
    x*          Multiplied by input
      _+h       Average of the value computed by last command and the value at current iteration
         4je    Round to 4 decimal digits

0

Solusi JAWA

kubus BigDecimal publik (Nomor BigDecimal) {

    if(number == null || number.intValue() == 0) return BigDecimal.ZERO;
    BigDecimal absNum = number.abs();
    BigDecimal t;
    BigDecimal root =  absNum.divide(BigDecimal.valueOf(3), MathContext.DECIMAL128);


    do {

        t = root;
        root = root.multiply(BigDecimal.valueOf(2))
                .add(absNum.divide(root.multiply(root), MathContext.DECIMAL128))
                .divide(BigDecimal.valueOf(3), MathContext.DECIMAL128);

    } while (t.toBigInteger().subtract(root.toBigInteger()).intValue() != 0);

    return root.multiply(number.divide(absNum), MathContext.DECIMAL128);
}

1
Selamat datang di PPCG! Ini adalah tantangan kode-golf , yang berarti tujuannya adalah untuk menyelesaikan tantangan kode sesedikit mungkin (dihitung dalam byte dari file sumber). Anda harus menunjukkan upaya untuk mengoptimalkan solusi Anda ke tujuan itu dan memasukkan jumlah byte dalam jawaban Anda.
Martin Ender

0

Solusi Python

def cube_root(num):
    if num == 0:
        return 0

    t = 0
    absNum = abs(num)
    root = absNum/3

    while (t - root) != 0:
        t = root
        root = (1/3) * ((2 * root) + absNum/(root * root))

    return root * (num / absNum)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.