2013-07-06 13 views
6

Se guardiamo allo stato di progetto Comittee del langage C: n1570 e in particolare alla Annex G sul comportamento delle complesse funzioni matematiche, possiamo vedere che il complesso esponenziale ha il seguente comportamento all'infinito:Perché cexp (+ infinito + I * infinito) = +/- infinito + I * NaN nel linguaggio C?

cexp(+infinity+I*infinity)=+/-infinity+I*NaN 
(where the sign of the real part of the result is unspecified). 

La mia domanda è: perché?

Da un punto di vista matematico, se ci avviciniamo all'infinito della parte reale e immaginaria allo stesso modo, il limite è un infinito complesso (vedi Wolfram Alpha per esempio), che corrisponde a un modulo infinito ea un argomento indefinito.

Inoltre, se si osserva il comportamento della funzione cexp, è paragonabile per la sua parte reale e immaginaria (vedere grafici 3D su Wolfram Alpha).

Quindi, mi sarei aspettato:

cexp(+infinity+I*infinity)=+/-infinity+/-I*infinity 

invece di:

cexp(+infinity+I*infinity)=+/-infinity+I*NaN 

So che c'è un ottimo motivo per questo, ma io non lo capisco. Qualcuno potrebbe spiegarmi la logica dietro a questo?

EDIT: ecco un riassunto dei link:

Summary

+2

La sezione G.5.1 del documento "Razionale per lo standard internazionale - Linguaggi di programmazione - C" sembra contenere alcuni commenti rilevanti sulla gestione di valori speciali per funzioni complesse incluso cexp(). Puoi trovarlo qui: http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf – njuffa

+0

Grazie per questo link. È molto istruttivo ma non porta la risposta riguardo al caso "cexp (infinito + I * infinito)". – Vincent

+0

L'unico documento di cui sono a conoscenza spiega il processo di riflessione del comitato per gli standard è il documento razionale. A meno che non si riescano a rintracciare le note per le riunioni della commissione (non so se i comitati ISO forniscono note pubbliche) o avere accesso a un membro della commissione temo la domanda sul perché lo standard dica ciò che dice rimarrà senza risposta. – njuffa

risposta

2

la motivazione è infatti dato nel documento collegato da njuffa, http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf:

7.3.9.4 La funzione cproj

due topologie sono comunemente usati in matematica complessa: il complesso aereo con la sua continuità degli infiniti, e la sfera di Riemann con relativo singolo infinito. Il piano complesso è più adatto per le funzioni trascendentali di , la sfera di Riemann per le funzioni algebriche. I tipi complessi con la loro molteplicità di infiniti forniscono un modello utile (benché imperfetto) per il piano complesso. La funzione cproj consente di modellare la sfera Riemann mappando tutti gli infiniti su e dovrebbe essere utilizzata prima di qualsiasi operazione, in particolare i confronti , che potrebbero dare risultati spuri per gli altri infiniti .

noti che un valore complesso con una parte infinita ed una parte NaN è considerato come un infinito, non un NaN, perché se una parte è infinito, il valore complesso è infinito indipendente dal valore dell'altro parte. Per lo stesso motivo, cabs restituisce un infinito se il suo argomento ha una parte infinita e una parte NaN.

C'è anche un'osservazione simile in G.5.1:

... Per sostenere il modello a sfioro, C99 riguarda qualsiasi valore complesso con almeno una parte infinita come infinito complesso (anche se l'altra parte è un NaN) e garantisce che le operazioni e le funzioni rispettino le proprietà di base degli infiniti e fornisce la funzione cproj per mappare tutti gli infiniti su uno canonico. ...

Il termine di ricerca in questione era "Riemann" come in Riemann sfera, il modello matematico per il piano complesso esteso con un unico infinito, che viene utilizzato in Mathematica/Wolfram Alpha, ma non universalmente in matematica.

0

Una ragione di NaN è che non c'è rappresentazione della 'direzione' questo valore infinito prende. Con i numeri reali, lim a->inf : exp(a) -> + infinity. Le indicazioni ben definiti danno un significato intuitivo per spiegare perché:

1/(+0) = +inf, 1.0/(-0.0) = -inf e:

1/(+inf) = +0, 1/(-inf) = -0

Estendendo questo al piano complesso: cexp([-]inf + b.I) = [-]inf.{cos(b) + I.sin(b)}

Anche se il risultato deve infinita magnitudine, c'è ancora una nozione di direzione, ad esempio, se b = - PI/2 ->cexp(+inf + b.I) = +inf.(-I)

Se b = [-]inf, la direzione verso cui si avvicina l'infinito è indeterminata. Esistono un numero infinito di direzioni e i valori per cos(b) e sin(b) non sono definiti. Non sorprende che le funzioni con valore reale cos[f|l] e sin[f|l] restituiscano un valore NaN se l'argomento è infinito.

Questa non è una risposta molto formale, temo, solo una "sensazione" per l'idea. La mia comprensione è che ci sono altre buone ragioni per questo comportamento, come l'uso di tagli alle branche in analisi complesse.