Domanda

Per quanto riguarda la divisione per zero, le norme dicono:

  

C99 6.5.5p5 - Il risultato dell'operatore / è il quoziente della divisione del primo operando dal secondo; il risultato dell'operatore% è il resto. In entrambe le operazioni, se il valore del secondo operando è zero, è definito il comportamento.

     

C ++ 03 5.6.4 - Il binario / operatore produce il quoziente, e l'operatore binario% produce il resto della divisione della prima espressione per il secondo. Se il secondo operando / o% è pari a zero è indefinito il comportamento.

Se dovessimo prendere paragrafi precedenti al valore nominale, la risposta è chiaramente Non definito Comportamento per entrambe le lingue. Tuttavia, se guardiamo più in basso nella norma C99 vediamo il seguente paragrafo che sembra essere contraddittoria (1):

  

C99 7.12p4 - La macro INFINITY espande in un'espressione costante di tipo float rappresenta l'infinito positivo o senza segno, se disponibile;

fare gli standard hanno una sorta di regola d'oro , dove non definito comportamento non può essere sostituito da un (potenzialmente) dichiarazione contraddittoria? A parte ciò, non credo che sia irragionevole concludere che se l'implementazione definisce la macro INFINITY, divisione per zero è definito come tale. Tuttavia, se l'implementazione non definire una macro, il comportamento è indefinito.

Sono curioso quello che il consenso è (se presente) in materia per ciascuna delle due lingue. Sarebbe il cambiamento risposta, se stiamo parlando di divisione intera int i = 1 / 0 contro floating float i = 1.0 / 0.0 divisione punto?

Nota (1) Il 03 parla standard di circa biblioteca <cmath> che include la macro INFINITY C ++.

È stato utile?

Soluzione

non vedo alcuna contraddizione. Divisione per zero è indefinito, punto. Non v'è alcuna menzione di "... a meno INFINITY viene definito" in qualsiasi parte del testo citato.

Si noti che in nessun posto in matematica si definisce che 1/0 = infinity . Una potrebbe interpretare in questo modo, ma è un, interpretazione personale "scorciatoia" stile, piuttosto che un fatto del suono.

Altri suggerimenti

1/0 non è l'infinito, solo

lim 1/x = ∞ (x -> +0)

Perché è vero?

Che non ha senso matematicamente, non è come se 1 / x è definito come ∞ in matematica in generale. Inoltre, si sarebbe almeno bisogno altri due casi:. -1 / x e 0 / x non può anche uguale ∞

divisione per zero in generale, e la sezione su computer aritmetica in particolare

Questa non era una domanda di matematica pura, ma un C / C ++ domanda.

  • Secondo l'IEEE 754 standard, che tutti i moderni compilatori C / uso di FPU, abbiamo
    • 3,0 / 0,0 = INF
    • 0.0 / 0.0 = NaN
    • -3.0 / 0.0 = -INF

Il FPU avrà un flag di stato che è possibile impostare per generare un'eccezione se lo si desidera, ma questo non è la norma.

INF può essere molto utile per evitare ramificazione quando INF è un risultato utile. Vedi la discussione qui

http://people.eecs.berkeley.edu/~wkahan/ ieee754status / IEEE754.PDF

ho solo il progetto C99. In §7.12 / 4 si legge:

  

La macro

    INFINITY
     

espande ad una costante espressione   tipo float rappresenta positivo o   l'infinito senza segno, se disponibile; altro   ad una costante positiva di tipo float   che trabocca in fase di traduzione.

Si noti che INFINITY può essere definita in termini di virgola mobile troppopieno, non necessariamente di divisione per zero.

Per la macro INFINITY: c'è una codifica per rappresentare l'infinito +/- esplicita nella norma IEEE754, che è se tutti i bit esponente sono impostati e tutti i bit frazione vengono cancellati (se è impostato un po frazione, essa rappresenta NaN)

Con il mio compilatore, (int) INFINITY == -2147483648, in modo da un'espressione che restituisce int i = 1/0 sarebbe sicuramente produrre risultati errati se INFINITIY è stato restituito

Implementazioni che definiscono __STDC_IEC_559__ sono tenuti a rispettare i requisiti di cui all'allegato F, che a sua volta richiede semantica a virgola mobile coerenti con IEC 60559. La norma non impone requisiti sul comportamento di divisione in virgola mobile da zero implementazioni cui non definiscono __STDC_IEC_559__, ma lo fa per quelli che fanno definirlo. Nei casi in cui IEC 60559 specifica un comportamento ma il C standard non è necessario un compilatore che definisce __STDC_IEC_559__ dalla C standard di comportarsi come descritto nella norma IEC.

Come definito da IEC 60559 (o USA standard IEEE-754) Divisione di zero a zero rendimenti NaN, divisione di un numero a virgola mobile da zero positivo o letterale costante pari a zero produce un valore INF con lo stesso segno del dividendo , e la divisione di un numero a virgola mobile da zero negativo rese un INF con segno opposto.

In conclusione, C99 (come per le vostre citazioni) non dice nulla circa INFINITY nel contesto di "implementazione definita". In secondo luogo, ciò che hai citato non mostra significato incoerente della "comportamento non definito".


[Citando pagina comportamento indefinito di Wikipedia] "In C e C ++, è utilizzato anche definito dall'implementazione comportamento, dove il linguaggio standard non specifica il comportamento, ma l'attuazione deve scegliere un comportamento e ha bisogno di documento e rispettare le regole che ha scelto ".

Più precisamente, i mezzi standard "implementazione definita" (io soltanto) quando utilizza queste parole rispetto alla dichiarazione fatta dal "implementazione definita" è un attributo specifico dello standard. La citazione di C99 7.12p4 non ha menzionato "implementazione definita".

[Da C99 std (progetto tardi)] "comportamento indefinito: il comportamento, dopo l'uso di un costrutto programma non portabile o erronea o di dati errati, per i quali la presente norma internazionale non impone requisiti"

Nota non c'è "alcun obbligo" imposto per comportamento non definito!

[C99 ..] "implementazione definita comportamento: comportamento non specificato dove ogni documenti di attuazione come la scelta è fatta"

[C99 ..] "comportamento non specificato: l'uso di un valore specificato, o altri comportamenti in cui presente norma internazionale fornisce due o più possibilità e non impone ulteriori requisiti su cui viene scelto qualsiasi istanza"

documentazione è un requisito per il comportamento attuazione definiti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top