2011-11-22 2 views
0

J'essaye de calculer la racine carrée d'un très grand nombre dans Ruby. Le problème que j'ai est que la fonction Math.sqrt ressemble à ceComment puis-je obtenir Math.Sqrt pour retourner un Bignum et non un Float?

sqrt(numeric) → float

Si je nourris un très gros chiffre, il va me donner FloatDomainError: Infinity. Quelle est la meilleure façon d'obtenir sqrt() pour retourner un BigNum? Y a-t-il peut-être une gemme pour cela ou devrais-je écrire ma propre fonction pour calculer la racine carrée?

Dans ce cas, quel est le moyen le plus facile de le faire? Taylor série? Les racines carrées des nombres seront toujours être des nombres entiers.

+0

Wow, plus grande que 'Float :: MAX # => 1.79769313486232e + 308'? Comment arrivez-vous à quelque chose de si grand? Y a-t-il des points intermédiaires où vous pourriez être en mesure de prendre racine? –

Répondre

5

Il est un moyen simple de calculer la racine carrée d'un nombre entier, qui se traduit par un nombre entier:

  1. Pour trouver la racine carrée d'un nombre, fixé M et P à ce numéro.
  2. Calculez ensuite (M + P/M)/2, en arrondissant chaque division vers le bas.
  3. Si M est égal ou inférieur au résultat, utiliser M comme racine carrée; autrement, définissez M au résultat et répéter ce processus à l'étape 2.

Cette approche peut être inefficace pour les grands nombres, cependant, donc essayer et voir.

EDIT:

Voici la mise en œuvre Ruby:

def mysqrt(x) 
    return 0 if x==0 
    m=x 
    p=x 
    loop do 
    r=(m+p/m)/2 
    return m if m<=r 
    m=r 
    end 
end 
+0

effectivement la formule est (2M + 2P)/M .. ai-je raison? – Baz1nga

+0

ce serait génial comment cela fonctionne pour sm nombre simple .. disons 9 – Baz1nga

+0

@ Baz1nga: Non, cette formule est complètement différente de '(m + p/m)/2' et conduirait à des résultats incorrects. –

Questions connexes