7
votes

Erreur: opérandes non valides au% binaire (avoir 'double' et 'double')

J'ai un programme que j'écris qui répertorie 100 000 nombres premiers. Cela fonctionne bien pour 10 chiffres, mais après tant de chiffres, ils se transforment en valeurs négatives. J'ai changé l'INTS vers Long Ints et cela n'a rien changé, alors je les ai changés vers les doubles et que je reçois l'erreur énumérée dans le titre. Que devrait être ma variable? Gardez à l'esprit que je suis toujours nouveau pour programmer. J'ai également regardé des postes antérieurs et je n'ai pas vu la réponse. XXX

c c++

6 commentaires

La réponse à ceci est fondamentalement la même chose que dans Comment puis-je convertir du flotteur vers INT avec module en C?


Hein? Long est requis pour atteindre au moins 2 milliards et le 100 000e numéro de choix n'est que de 1,3 million. Si vous débordez, votre programme a raté un lot de nombres premiers. Long devrait être bien (selon que int soit pourvu que c'est 32 bits, ce qui est normal). Comparez la sortie de votre programme à ceci: numérique.library.upenn.edu / Webbin / gutbook / lookup? Num = 65 , voyez où cela va mal. Et vérifiez que vous émettez les valeurs correctement ...


@ Steve J'ai apporté les modifications suggérées et a toujours les mêmes résultats, est-ce parce que je pose ces valeurs dans un tableau de charme [], si cela devrait être autre chose?


Vous devriez vraiment utiliser un type d'entier pour les nombres premiers, pas une représentation de points flottant. Je suis d'accord avec Steve Jessop que vous avez probablement un autre problème. Vous devriez essayer de résoudre ce problème - je m'attends à ce que votre enseignant marquait une réponse utilisée double . FWIW, le 100 000e Prix est de 1 299 709.


@spong Ouais j'ai compris que ce n'était pas mon problème initial. Quand j'ai fait ces changements, rien n'a changé vraiment, je ne sais pas ce qui ne va pas, je soupçonne un tableau de charret [], ne peut pas tenir les valeurs que j'essaie de rester. Idées?


@Pisfire: Oui, si vous mettez les résultats dans le tableau Char , c'est votre problème. La gamme de Char sur votre implémentation C est presque certainement [-128,127], de sorte que les valeurs supérieures à 127 iront mal. Char signifie un caractère, un octet ou un très petit entier. Comme les types vont, il est à peu près inutile pour l'arithmétique.


3 Réponses :


18
votes

Vous ne pouvez pas utiliser un double avec l'opérateur, vous devez avoir un int.

Vous devez: #include code>, puis utilisez la fonction FMOD. P >

 #include <math.h>
 int is_prime(double x,char array[]){
 //doesnt use array but I put it in there

     double j=2;//divider
     for(j=2;j<=pow(x,0.5);j++){
         if(fmod(x,j)==0){
             return(0);
         }   //isnt prime  
     }
     return(1);// because it is prime.
 }


1 commentaires

Impressionnant, je n'aurais jamais compris cela seul.



5
votes

Vous avez deux options:

  1. Stick avec l'opérateur % code>, alors vous devez lancer les entrées sur INT CODE> S P>

    if(fmod(x, j) == 0)
    
  2. Inclure math.h code> puis utilisez fmod code>: p>

    if(((int)x % (int)j) == 0)
    


1 commentaires

MATH.H SON AFFAIRE UNE BELLE SOLUTION, +1.



0
votes

Votre question immédiate peut être résolue avec FMOD , mais pour votre objectif de nombres premiers de grande valeur, vous pourrez peut-être mieux regarder une classe de grande entière, comme ça à http://sourceforge.net/projects/cpp-bigint/ Depuis ce que vous voulez vraiment, c'est des mathématiques entières, et L'utilisation de floats peut causer des problèmes lorsque les choses progressent.


0 commentaires