Punto in virgola mobile indesiderabile nel codice altamente critico?

6

La domanda 11 nella sezione Qualità del software di "IEEE Computer Society Real-World Software Engineering Problemi", Naveda, Seidman, elenca il calcolo Fp come indesiderabile perché "la precisione dei calcoli non può essere garantita" .

Questo è nel contesto dell'accelerazione del calcolo per un sistema di frenatura di emergenza per un treno ad alta velocità. Questo pensiero sembra invocare possibili errori in piccole differenze tra le misurazioni di un oggetto in movimento, ma piccole differenze a bassa velocità non sono un problema (o non dovrebbero essere), piccole differenze tra due misurazioni ad alta velocità sono irrilevanti - può esserci un problema con piccoli errori di arrotondamento durante la decelerazione per un sistema di frenatura di emergenza? Questo problema è stato osservato con i sistemi di frenatura degli aeroplani che hanno portato all'aquaplaning, ma ciò potrebbe effettivamente accadere nel contesto di un treno ad alta velocità? La preoccupazione per gli errori di fp sembra non essere ben fondata in questo contesto. Qualche intuizione? Il fp è utilizzato per l'accelerazione, quindi forse la preoccupazione è in ritardo su un limite di velocità? Ma fp dovrebbe andare bene se usano un doppio in qualunque linguaggio di implementazione.

Il problema reale nel testo afferma: Durante l'ispezione del codice per il sistema di frenatura di emergenza di un nuovo treno ad alta velocità (un'applicazione estremamente critica in tempo reale), il team di revisione identifica diverse caratteristiche del codice. Quale di queste caratteristiche è generalmente considerata indesiderabile?

  1. Il codice contiene tre funzioni ricorsive (anche se è ovvio).
  2. Il calcolo dell'accelerazione utilizza l'aritmetica in virgola mobile.
  3. Tutti gli altri calcoli utilizzano l'aritmetica dei numeri interi.
  4. Il codice contiene un elenco collegato che utilizza l'allocazione dinamica della memoria (secondo ovvio problema).
  5. Tutti gli input vengono controllati per determinare che rientrano nei limiti previsti prima che vengano utilizzati.
posta Kirt Undercoffer 26.09.2012 - 00:27
fonte

3 risposte

5

Il problema con il codice a virgola mobile è che non si comporta come i calcoli aritmetici decimali carta e penna. Questo porta le persone che non hanno avuto il tempo di capire cosa sta succedendo per fare ipotesi errate sul comportamento dei numeri in virgola mobile, che possono quindi portare a un comportamento scorretto del programma. Il comportamento dei calcoli FP con numeri molto grandi e molto piccoli può essere abbastanza poco intuitivo, specialmente se si mescolano i due.

SE il tuo team comprende i numeri in virgola mobile e come funzionano, e SE la progettazione del tuo sistema non include nulla che farà scattare i calcoli FP, allora non c'è alcun motivo intrinseco per non usarli.

In molti casi è molto più facile mettere una proibizione generale su FP, piuttosto che cercare di assicurare che tutti capiscano cosa stanno facendo e che i numeri non possono allontanarsi da te in modi imprevisti. Il team di revisione potrebbe inoltre trovare più semplice verificare che stai eseguendo le conversioni e i calcoli correttamente in interi anziché in FP, perché è più facile vedere dove perderai la precisione.

    
risposta data 26.09.2012 - 15:11
fonte
4

Il virgola mobile è indesiderabile solo se si utilizza il metodo sbagliato per confrontare due valori (un segno di uguale anziché un delta o intervalli estremi in cui l'errore relativo (ulps) è troppo grande). I numeri FP non sono male per i sistemi in tempo reale.

Tuttavia, le funzioni ricorsive e l'allocazione dinamica della memoria sono, per ovvi motivi; le prestazioni in tempo reale di questi possono essere difficili da prevedere.

    
risposta data 26.09.2012 - 00:41
fonte
1

Il virgola mobile è generalmente indesiderabile nelle applicazioni hard-real-time sia a causa dell'accumulo di errori sia del fatto che il calcolo FP è in genere più lento dell'aritmetica intera. Poi hai anche il sovraccarico con la promozione di interi in virgola mobile (o viceversa) per il confronto se stai mescolando i due. E poiché non puoi semplicemente confrontare un numero in virgola mobile a zero, puoi trasformare un'istruzione semplice come if(x == 0) in if(x > -0.0001 && x < 0.001) - sei passato da un semplice confronto a due confronti e un'operazione logica. Non è quello che vuoi sprecare cicli quando la vita delle persone è in gioco.

    
risposta data 26.09.2012 - 14:30
fonte

Leggi altre domande sui tag