-1
votes

N est un numéro Ramanujan - pourquoi suis-je des erreurs des valeurs près de 2 ^ 63?

Étant donné un numéro, testez pour voir s'il s'agit d'un numéro Ramanujan (défini dans notre cours comme somme de deux cubes deux manières différentes). Il doit courir en n ^ (1/3) heure.

Mon code fonctionne - parfois. À mesure que les valeurs de test s'approchent 2 ^ 63 -1, je reçois des erreurs aléatoires.

Beirdly, je faisais passer ce test pour des chiffres dans cette plage avant de changer la valeur de départ d'un compteur pour corriger un bogue différent. Quelqu'un peut-il me dire pourquoi cela pourrait être?

i configurez A pour la boucle pour créer des valeurs pour un ^ 3.

Puis je définis des valeurs pour b = (N-A ^ 3) ^ (1/3).

Puis je testez B pour voir s'il s'agit d'un entier. Si c'est le cas, casser la boucle.

inséré AN a inséré un test ici pour obtenir le code de travail, bien que je n'ai aucune idée de la raison pour laquelle cela est nécessaire, et c'est le gist de cette question. Cette instruction définit deux différentes boucles pour les valeurs ci-dessus et ci-dessous n = 2 ^ 63

secondaire de la seconde boucle pour n <2 ^ 63, démarre avec c = A + 1 donc je ne fais pas dupliquer. C'est la même chose que le premier.

deuxième boucle pour N> 2 ^ 63 commence par C = A.

Pourquoi cela ferait-il une différence? Pourquoi le même code ne fonctionne-t-il pas pour des nombres plus petits et plus importants?

Désolé pour le code Babyish, je commence juste et beaucoup de fonctions sont hors limites dans mon cours. (Par exemple, je ne pouvais pas utiliser le sol () et n'a pas été autorisé à écrire ma propre fonction pour cela, non plus). xxx

n'importe quel aperçu de la raison pour laquelle j'ai besoin de différencier des nombres plus gros et plus petits?


0 commentaires

3 Réponses :


1
votes

Vous obtiendrez des résultats étranges lorsque n code> dépasse la valeur A long code> peut contenir, c'est-à-dire math.pow (2, 63) == long.max_value code>. À ce moment-là, n code> subira un débordement numérique.

final long l = Long.MAX_VALUE; // == 2^63
System.out.println(l); // 9223372036854775807
System.out.println(l + 1); // -9223372036854775808


1 commentaires

Vrai, mais les valeurs étaient juste en dessous de ce seuil. Les tests utilisés contre le programme étaient les suivants: Test 13: Vérifiez Isramanujan () avec les numéros Ramanujan près de 2 ^ 63 - 1 * Isramanujan (9223261564912520489) * Isramanujan (9223278330318728221) ==> passée



0
votes

Le plus grand nombre d'une longue quantité peut contenir (en Java) est (2 ^ 63) - 1 (long.max_value). Pourquoi calculez-vous math.cbrt (A3)? Si A3 = A * A * A, alors vous savez déjà quoi MATH.CBRT (A3) est.

Il y a un problème dans votre code si N> 9223372036854774272 Math.cbrt de 9223372036854774273 est 2097152 et si vous cube que vous obtenez un nombre négatif à cause de débordement.


0 commentaires

0
votes

Le problème est avec la multiplication de variables A et C de type int pour calculer le cube. Besoin de casting chacune de la variable à long qui est multiplié.

exemple, A3 = (long) a * (long) A * (long) A;


0 commentaires