it-swarm.it

Mod Zero possibile?

Perché X % 0 è un'espressione non valida?

Ho sempre pensato che X % 0 dovrebbe essere uguale a X. Dal momento che non puoi dividere per zero, la risposta non dovrebbe essere naturalmente il resto, X (tutto rimasto)?

54
Dasaru

The C++ Standard (2003) dice in §5.6/4,

[...] Se il secondo operando di/o% è zero, il comportamento è undefined ; [...]

Cioè, le seguenti espressioni invocano un comportamento non definito (UB):

X / 0; //UB
X % 0; //UB

Si noti inoltre che -5 % 2 NON è uguale a -(5 % 2) (come Petar sembra suggerire nel suo commento alla sua risposta). È definito dall'implementazione. Le specifiche dicono (§5.6/4), 

[...] Se entrambi gli operandi non sono negativi, il resto non è negativo; in caso contrario, il segno del resto è definito dall'implementazione .

38
Nawaz

Questa risposta non è per il matematico. Questa risposta tenta di dare motivazione (al costo della precisione matematica).

Matematici:Vedi qui.

Programmers: Ricorda che la divisione di 0 è undefined. Pertanto, mod, che si basa sulla divisione, è anche undefined.


Rappresenta la divisione per X e D positivi; è composto dalla parte integrale e dalla parte frazionaria:

(X / D) =   integer    +  fraction
        = floor(X / D) + (X % D) / D

Riorganizzando, ottieni:

(X % D) = D * (X / D) - D * floor(X / D)

Sostituendo 0 per D:

(X % 0) = 0 * (X / 0) - 0 * floor(X / 0)

Poiché la divisione per 0 è undefined:

(X % 0) = 0 * undefined - 0 * floor(undefined)
        = undefined - undefined
        = undefined
10
Mateen Ulhaq

X % D è di definition un numero 0 <= R < D, tale che esiste Q in modo che

X = D*Q + R

Quindi se D = 0, nessun numero di questo tipo può esistere (perché 0 <= R < 0)

4
Petar Ivanov

Penso che per ottenere il resto di X % 0 devi prima calcolare X / 0 che produce infinito, e provare a calcolare il resto dell'infinito non è realmente possibile.

Tuttavia, la soluzione migliore in linea con il tuo pensiero sarebbe quella di fare qualcosa di simile

REMAIN = Y ? X % Y : X
2
Billy Moon

Un altro modo in cui è concettualmente facile capire il problema:

Ignorando per il momento il problema del segno dell'argomento, a % b potrebbe essere facilmente riscritto come a - ((a / b) * b). L'espressione a / b non è definita se b è zero, quindi in tal caso deve essere presente anche l'espressione generale.

Alla fine, il modulo è effettivamente un'operazione di divisione, quindi se a / b non è definito, non è irragionevole aspettarsi che a % b sia altrettanto valido.

2
Mac

X% Y dà un risultato nell'intervallo [0, Y) intero. X% 0 dovrebbe fornire un risultato maggiore o uguale a zero e inferiore a zero.

1
K-ballo

puoi eludere il caso "divivion by 0" di (A% B) per il suo tipo identity float mod (a, b) per float (B) = b = 0.0, che non è definito, o definito in modo diverso tra 2 implementazioni, a evitare errori logici (crash) a favore di errori aritmetici ...

calcolando mod([a*b],[b])==b*(a-floor(a))
INSTREAD DI
computing mod([a],[b])

dove [a * b] == il tuo asse x, nel tempo [b] == il massimo della curva altalena (che non sarà mai raggiunta) == la prima derivata della funzione altalena

https://www.shadertoy.com/view/MslfW8

0
ollj