TI2/Rechnerarchitektur-Tutorium, 24.11.2016

Inhaltliches

IEEE 754

This work (licensed under CC BY-SA 4.0 by Jonas Cleve) is a derivative of The memory format of an IEEE 754 double floating point value by Codekaizen used under CC BY-SA 4.0.
This work (licensed under CC BY-SA 4.0 by Jonas Cleve) is a derivative of “The memory format of an IEEE 754 double floating point value” by Codekaizen used under CC BY-SA 4.0.
Parameter Single Double
Bits Gesamt 32 64
Bits Mantisse 23(+1) 52(+1)
Bits Charakteristik 8 11
Exponent-Verschiebung +127 +1023

Wert = ( − 1)Vorzeichen ⋅ 1, Mantisse ⋅ 2(Charakteristik − Verschiebung)

IEEE-Besonderheiten

  • Charakteristik = 00…00
    • Wert = ( − 1)VZ ⋅ 0, Mantisse ⋅ 2(1 − Verschiebung)
    • Denormalisierte Zahlen
  • Charakteristik = 11…11 Mantisse = 00…00
    • Wert = ( − 1)VZ ⋅ ∞
    • Overflow
  • Charakteristik = 11…11 Mantisse 00…00
    • Wert = NaN
    • Not a Number

Runden

  • Gibt verschiedene Rundungsregeln
    • Round to nearest + ties to even
    • Round to nearest + ties away from zero
    • Round to zero
    • Round to +∞
    • Round to −∞
  • Für uns wichtig: “normales” Runden + “round-to-even” bei gleichem Abstand

Assembler

Floating-Point-Rechnung

  • Es gibt in C zwei grundlegende Datentypen für Kommazahlen
    • float für single precision
    • double für double precision
  • Dafür gibt es spezielle Register: xmm0, xmm1, …, xmm15
  • Dafür gibt es jeweils verschiedene Operationen, z.B.
    • ADDSS (add scalar single) zur Addition von floats
    • ADDSD (add scalar double) zur Addition von doubles
  • Es gibt quasi alle arithmetischen Befehle für Ganzzahlen auch für Kommazahlen
    • Genaue Anzahl der Operanden eventuell verschieden
    • Immer an das SD am Ende denken

Floating-Point-Konstanten

  • Konstanten können nicht direkt angegeben werden
  • Operanden können in der Regel nur xmm-Register oder Speicherstellen sein
section .data    ; Daten-Bereich -- KEIN Code
    value:       ; Zugriff über dieses Label
        dq 12.45 ; Speichere 64bit-Komma-Zahl (Quad word)

section .text    ; Code-Bereich
func:
    movsd xmm0, [value] ; Kopiere die 12.45 nach xmm0
    ret