Come uso il modulo per float / double?

Sto creando un calcolatore RPN per un progetto scolastico. Sto avendo problemi con l’operatore modulo. Dato che stiamo usando il doppio tipo di dati, il modulo non funzionerà su numeri in virgola mobile. Ad esempio, 0,5% 0,3 dovrebbe restituire 0,2 ma sto ottenendo una divisione per eccezione zero.

L’istruzione dice di usare fmod (). Ho cercato ovunque fmod (), incluso javadocs ma non riesco a trovarlo. Sto iniziando a pensare che sia un metodo che dovrò creare?

modifica: hmm, strano. Ho appena ricollegato quei numeri e sembra che stia funzionando bene … ma per ogni evenienza. Devo fare attenzione a usare l’operatore mod in Java quando utilizzo i tipi floating? So che qualcosa del genere non può essere fatto in C ++ (credo).

Probabilmente hai avuto un errore quando lo hai eseguito per la prima volta.

la valutazione dello 0.5 % 0.3 riporta “0,2” (A doppio) come previsto.

Mindprod ha una buona panoramica di come funziona il modulo in Java.

A differenza di C, Java consente di usare% sia per intero che per virgola mobile e (a differenza di C89 e C ++) è ben definito per tutti gli input (inclusi i negativi):

Da JLS §15.17.3 :

Il risultato di un’operazione di resto in virgola mobile è determinato dalle regole dell’aritmetica IEEE:

  • Se uno degli operandi è NaN, il risultato è NaN.
  • Se il risultato non è NaN, il segno del risultato è uguale al segno del dividendo.
  • Se il dividendo è un infinito, o il divisore è uno zero, o entrambi, il risultato è NaN.
  • Se il dividendo è finito e il divisore è un infinito, il risultato equivale al dividendo.
  • Se il dividendo è uno zero e il divisore è finito, il risultato equivale al dividendo.
  • Nei casi rimanenti, dove non è coinvolto né un infinito, né uno zero, né un NaN, il resto a virgola mobile r dalla divisione di un dividendo n per un divisore d è definito dalla relazione matematica r = n- (d · q ) dove q è un numero intero che è negativo solo se n / d è negativo e positivo solo se n / d è positivo e la cui grandezza è il più grande ansible senza superare l’entity framework del vero quoziente matematico di n e d.

Quindi per il tuo esempio, 0.5 / 0.3 = 1.6 …. q ha lo stesso segno (positivo) come 0,5 (il dividendo) e la magnitudine è 1 (intero con grandezza massima non superiore alla magnitudine di 1,6 …), e r = 0,5 – (0,3 * 1) = 0,2

Pensavo che l’operatore del modulo regolare avrebbe funzionato per questo in java, ma non può essere difficile codificarlo. Basta dividere il numeratore per il denominatore e prendere la parte intera del risultato. Moltiplicare quello per il denominatore e sottrarre il risultato dal numeratore.

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

fmod è la funzione standard C per la gestione del modulo a virgola mobile; Immagino che la tua fonte fmod dicendo che Java gestisce il modulo a virgola mobile come la funzione fmod di fmod In Java puoi usare l’operatore % su doppio come su interi:

 int x = 5 % 3; // x = 2 double y = .5 % .3; // y = .2