Question

Je crée une calculatrice RPN pour un projet scolaire. Je vais avoir du mal avec l'opérateur de module. Comme nous utilisons la double type de données, le module ne fonctionnera pas sur les nombres à virgule flottante. Par exemple, 0,5% 0,3 devrait revenir à 0,2 mais je me fais une division par zéro exception.

L'instruction dit utiliser fmod (). Je l'ai cherchée partout fmod (), y compris javadocs mais je ne le trouve pas. Je commence à penser que c'est une méthode que je vais devoir créer?

edit: hmm, étrange. Je viens branché ces chiffres à nouveau et il semble fonctionner très bien ... mais juste au cas où. Ai-je besoin de regarder à l'aide de l'opérateur mod en Java lors de l'utilisation des types flottants? Je sais que quelque chose comme ça ne peut pas être fait en C ++ (je pense).

Était-ce utile?

La solution

Vous avez probablement eu une faute de frappe lors de la première diffusait.

évaluation revient 0.5 % 0.3 '0,2' (un double) comme prévu.

mindprod a bonne vue d'ensemble de la façon dont fonctionne le module en Java.

Autres conseils

Contrairement C, Java permet d'utiliser le% pour les nombres entiers et en virgule flottante et (contrairement à C89 et C ++), il est bien définie pour toutes les entrées (y compris les négatifs):

De JLS §15.17.3 :

  

Le résultat d'une virgule flottante   calcul de reste est déterminée par   les règles de l'arithmétique IEEE:

     
      
  • Si l'un des opérandes est NaN, le résultat est NaN.
  •   
  • Si le résultat est NaN, le signe du résultat est égal au signe de   le dividende.
  •   
  • Si le dividende est un infini, ou le diviseur est un zéro, ou les deux, la   résultat est NaN.
  •   
  • Si le dividende est fini et le diviseur est une infinité, le résultat   est égal au dividende.
  •   
  • Si le dividende est un zéro et le diviseur est fini, le résultat   est égal au dividende.
  •   
  • Dans les autres cas, où ni une infinité, ni un zéro, ni   NaN est impliqué, la virgule flottante   reste r de la division d'un   n de dividende par un diviseur D est défini   par la relation mathématique r = n- (d · q)   où q est un nombre entier qui est négatif   que si n / d est négative et positive   que si n / d est positif, et dont   l'ampleur est aussi grande que possible   sans dépasser l'ampleur du   vrai quotient mathématique de n et d.
  •   

Donc, pour votre exemple, 0,5 / 0,3 = 1,6 .... q a le même signe (positif) 0,5 (dividende), et l'amplitude est de 1 (nombre entier ayant la plus grande amplitude ne dépassant pas magnitude de 1,6 ...), et r = 0,5 - (0,3 * 1) = 0,2

Je pensais que l'opérateur de module régulier travaillerait pour cela en java, mais il ne peut pas être difficile à coder. Il suffit de diviser le numérateur par le dénominateur, et prendre la partie entière du résultat. Multiplier par le dénominateur, et soustraire le résultat du numérateur.

x = n / d
xint = Integer portion of x
result = n - d * xint

fmod est la fonction C standard pour la manipulation de module à virgule flottante; J'imagine votre source a dit que les poignées Java à virgule flottante module identique à la fonction de fmod C. En Java, vous pouvez utiliser l'opérateur % en double la même que sur des entiers:

int x = 5 % 3; // x = 2
double y = .5 % .3; // y = .2
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top