Per esempio,
int result;
result = 125/100;
o
result = 43/100;
Il risultato sarà sempre il pavimento della divisione? Qual è il comportamento definito?
"I just throw the dam fraction part in the trash and move on with life"
Per esempio,
int result;
result = 125/100;
o
result = 43/100;
Il risultato sarà sempre il pavimento della divisione? Qual è il comportamento definito?
"I just throw the dam fraction part in the trash and move on with life"
Risposte:
Il risultato sarà sempre il pavimento della divisione? Qual è il comportamento definito?
Sì, quoziente intero dei due operandi.
6.5.5 Operatori moltiplicativi
6 Quando gli interi sono divisi, il risultato dell'operatore / è il quoziente algebrico con qualsiasi parte frazionaria scartata. 88) Se il quoziente a / b è rappresentabile, l'espressione (a / b) * b + a% b deve essere uguale a.
e la nota a piè di pagina corrispondente:
88) Questo è spesso chiamato '' troncamento verso zero ''.
Naturalmente due punti da notare sono:
3 Le solite conversioni aritmetiche vengono eseguite sugli operandi.
e:
5 Il risultato dell'operatore / è il quoziente della divisione del primo operando per il secondo; il risultato dell'operatore% è il resto. In entrambe le operazioni, se il valore del secondo operando è zero, il comportamento non è definito.
[Nota: enfasi sulla mia]
(a / b) * b + a % b == a
dovevano essere soddisfatti e il valore assoluto di a % b
doveva essere inferiore a a
, ma se a % b
era negativo per negativo a
o b
non era specificato.
Dirkgently fornisce un'eccellente descrizione della divisione intera in C99, ma dovresti anche sapere che in C89 la divisione intera con un operando negativo ha una direzione definita dall'implementazione.
Dalla bozza ANSI C (3.3.5):
Se uno degli operandi è negativo, se il risultato dell'operatore / è il numero intero più grande inferiore al quoziente algebrico o il numero intero più piccolo maggiore del quoziente algebrico è definito dall'implementazione, così come il segno del risultato dell'operatore%. Se il quoziente a / b è rappresentabile, l'espressione (a / b) * b + a% b deve essere uguale a.
Quindi fai attenzione con i numeri negativi quando sei bloccato con un compilatore C89.
È un fatto divertente che C99 abbia scelto il troncamento verso zero perché è stato così che FORTRAN l'ha fatto. Vedi questo messaggio su comp.std.c.
reliable integer division
come una nuova funzionalità linguistica. Incredibile *-*
.
expr1 / expr2
e expr1 % expr2
deve essere coerente con l'altro quando entrambi istanze di expr1
combinare gli stessi oggetti nello stesso modo, e così per expr2
, ma la scelta di troncare rispetto divisione pavimento è altrimenti specificato. Ciò avrebbe consentito una generazione di codice più efficiente senza compromettere molta compatibilità (e le implementazioni potrebbero documentare comportamenti specifici se propensi)
Dove il risultato è negativo, C si tronca verso 0 anziché verso il pavimento - Ho imparato questa lettura sul perché la divisione di numeri interi di Python va sempre a segno qui: Perché la divisione di numeri interi di Python Floors
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
ripetuto con la modifica dei valori di value
. Fa una bella approssimazione di numeri interi a un filtro passa-basso del primo ordine con costante di tempo k
... ma è solo simmetrico se la divisione viene troncata e carry
ottiene valori negativi. Entrambi i comportamenti per la divisione sono utili di volta in volta.
div
è un operatore di divisione a pavimento ed factor
è dispari, allora filtered += (filter+(factor div 2)) div factor
produrrebbe un comportamento pulito e simmetrico per tutti i valori fino a INT_MAX-(factor div 2)
.
Sì, il risultato viene sempre troncato verso zero. Arrotonderà verso il valore assoluto più piccolo.
-5 / 2 = -2
5 / 2 = 2
Per i valori con segno non firmato e non negativo, questo è uguale a floor (arrotondamento verso -Infinito).
Il risultato sarà sempre il pavimento della divisione?
No. Il risultato varia, ma la variazione si verifica solo per valori negativi.
Qual è il comportamento definito?
Per chiarire che il piano si arrotonda verso l'infinito negativo, mentre la divisione dei numeri interi arrotonda verso lo zero (tronca)
Per valori positivi sono gli stessi
int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0
Per valore negativo questo è diverso
int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
So che le persone hanno risposto alla tua domanda ma in termini laici:
5 / 2 = 2
// poiché sia 5 che 2 sono numeri interi e la divisione dei numeri interi tronca sempre i decimali
5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5
// qui 5 o 2 o entrambi hanno i decimali, quindi il quoziente che otterrai sarà in decimale.