Lo standard IEEE754 definisce due classi di NaN, il NaN silenzioso, QNaN e la segnalazione NaN, SNaN. Quando un SNaN viene caricato in un registro a virgola mobile, viene sollevata un'eccezione dall'unità in virgola mobile.Come posso rendere semplice la segnalazione dei NaN?
QNaN è disponibile per il codice Delphi tramite la costante denominatadichiarata in Math
. La definizione di tale costante è:
const
NaN = 0.0/0.0;
Mi piacerebbe essere in grado di usare qualcosa di simile a dichiarare una costante che è una segnalazione NaN, ma non ho ancora trovato un modo per farlo.
Ingenuamente si potrebbe scrivere questo codice:
function SNaN: Double;
begin
PInt64(@Result)^ := $7FF7FFFFFFFFFFFF;//this bit pattern specifies an SNaN
end;
Ma l'ABI per il galleggiamento valori di ritorno punto significa che lo Snan viene caricato in un registro in virgola mobile in modo che possa essere restituito. Naturalmente ciò porta a un'eccezione che sconfigge piuttosto lo scopo.
così si è poi portato alla scrittura di codice come questo:
procedure SetToSNaN(out D: Double);
begin
PInt64(@D)^ := $7FF7FFFFFFFFFFFF;
end;
Ora, questo funziona, ma è molto scomodo. Supponiamo di dover passare un SNaN ad un'altra funzione. Idealmente si desidera scrivere:
Foo(SNaN)
ma invece si deve fare questo:
var
SNaN: Double;
....
SetToSNaN(SNaN);
Foo(SNaN);
Così, dopo il build-up, ecco la domanda.
C'è un modo per scrivere x := SNaN
e la variabile in virgola mobile x
ha assegnato un valore che è un NaN di segnalazione?
Hai provato a inserire il tuo primo approccio? –
@UweRaabe In effetti ho. Volevo che qualcun altro scrivesse quella risposta in modo che potessero ottenere il rappresentante. Mi sento ancora un po 'a disagio nel fare affidamento su inlining. Se la chiamata di funzione non è in qualche modo in linea, quindi boom. –