2013-06-04 14 views
14

La divisione per zero in un programma C provoca la terminazione anomala con il messaggio di errore Floating point exception (core dumped). Questo non è sorprendente per la divisione in virgola mobile, ma perché lo dice quando si verifica la divisione intera per zero? La divisione intera utilizza effettivamente la FPU sotto il cofano?Perché la divisione intera per zero risulta in un'eccezione a virgola mobile?

(Questo è tutto su Linux sotto x86, tra l'altro.)

+1

Vale la pena notare che altri sistemi operativi non POSIX (ad esempio Windows) e l'hardware x86 segnalano diverse eccezioni per il numero intero e la divisione in virgola mobile per zero. – Crashworks

+0

Correlati: [Su quali piattaforme il numero intero divide per zero genera un'eccezione in virgola mobile?] (Https://stackoverflow.com/questions/37262572/on-which-platforms-does-integer-divide-by-zero-trigger- a-floating-point-exceptio). TL: DR: POSIX richiede che sia SIGFPE se c'è un segnale. –

risposta

22

la divisione intera in realtà usano la FPU sotto il cofano?

No, Linux genera solo SIGFPE anche in questo caso (è un nome legacy il cui utilizzo è stato ora esteso). Infatti, la Specifica Unix defines SIGFPE come "Operazione aritmetica errata".

3

man signal menzioni:

Divisione intera per zero è indefinito risultato. Su alcune architetture genera un segnale SIGFPE. (Dividendo Anche il numero intero più negativa da -1 può generare SIGFPE.)

1

mia ipotesi ad una spiegazione storica per questo sarebbe che l'hardware originale unix non ha generato una trappola a divisione intera per zero, quindi la nome SIGFPE aveva senso. (Programmatori di assemblaggi PDP, confermare?) Poi più tardi, quando il sistema è stato portato (o nel caso di Linux, reimplementato) all'hardware con una trappola divisione per zero, non è stato considerato utile aggiungere un nuovo numero di segnale, quindi il vecchio ha acquisito un nuovo significato e ora ha un nome un po 'confuso.

0

Ci potrebbero essere diversi motivi specifici per l'implementazione.

Ad esempio, l'unità FPU su piattaforma x86 supporta entrambi i formati in virgola mobile e integer per la lettura di argomenti e risultati di scrittura. Quando la piattaforma stessa era a 16 bit, alcuni compilatori usavano la FPU per eseguire la divisione con operandi interi a 32 bit (poiché non vi è perdita di precisione per i dati a 32 bit di larghezza). In tali circostanze, non ci sarebbe nulla di insolito nell'ottenere un vero errore FPU per la divisione integer a 32 bit non valida.

+0

Le eccezioni FP sono normalmente mascherate, quindi ottieni solo un risultato NaN o +/- Inf invece di un'eccezione. Mi chiedo se il SIGFPE per la convenzione/tradizione delle eccezioni di divisione intera sia iniziato prima di x86? Unix non poteva essere correttamente portato su x86 fino a 386 (modalità protetta), ma alcuni ambienti simili a Unix senza una vera protezione della memoria esistevano, penso. –

Problemi correlati