Office: Excel VBA - Single vs Double - warum andere Ergebnisse?

Helfe beim Thema Excel VBA - Single vs Double - warum andere Ergebnisse? in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo, beim "basteln" eines Makros für diese Fragestellung... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von fette Elfe, 11. Oktober 2011.

  1. fette Elfe Erfahrener User

    Excel VBA - Single vs Double - warum andere Ergebnisse?


    Hallo,

    beim "basteln" eines Makros für diese Fragestellung
    http://www.office-hilfe.com/support...-ersten-januaren-addieren-und-mittelwert.html
    sind mir unterschiedliche Ergebnisse bei der Benutzung von Variablen des Typs Single und Variablen des Typs Double aufgefallen.

    Bisher dachte ich, Single und Double würden die gleichen Zahlen enthalten (also auch gleich rechnen), außer das Double einen größeren Bereich umfasst.
    Ähnlich wie bei Integer und Long, wo mir noch nie ein Unterschied in irgendwelchen Ergebnissen aufgefallen ist, solange ich natürlich im Bereich von Integer blieb.

    Laut Definition:
    Single Fließkommazahl 4 Bytes +/- 1,4E-45 bis 3,4E38
    Double Fließkommazahl 8 Bytes +/- 4,9E-324 bis 1,8E308
    kann ich mir die unterschiedlichen Ergebnisse in der angehängten Beispielmappe nicht erklären.

    Wär lieb wenn mich jemand "erleuchten" könnte.
     
    fette Elfe, 11. Oktober 2011
    #1
  2. Thomas Ramel MVP für Microsoft Excel
    Grüezi Achim

    Wenn ich mir die Beschreibungen zu den Datentypen in der Online-Hilfe näher ansehe dann finde ich folgendes:

    Single (Gleitkommazahl mit einfacher Genauigkeit)
    Double (Gleitkommazahl mit doppelter Genauigkeit)

    Doubles können also durch ihre längere Mantisse präzisere Werte und Genauigkeiten berechnen.
    Und gerade bei Mittelwerten bewegt man sich gerne in kleinen Nachkommawerten wo die Gleitkomma-Berechnung dann stark zum Tragen kommt.

    Sobald Du die Single-Werte auf 5 Nachkommastellen rundest (das Standard-Verfahren bei Gleikommawerten) sind die Ergebnisse der beiden Berechnungen wieder identisch.
     
    Thomas Ramel, 12. Oktober 2011
    #2
  3. fette Elfe Erfahrener User
    Hallo Thomas,
    danke für Deine Erklärung.

    Okay, soweit kann ich das ja noch nachvollziehen.

    Was ich bisher beim besten Willen nicht nachvollziehen kann ist:
    Bsp.
    Summe aller 2. Januare:
    2,2 + 6,1 + 5,6 = 13,8999996185302 anstatt 13,9

    Bei Min und Max das gleiche.


    Wieso kommt Excel bei der Verwendung von Singles, in einer Auflistung wo NUR Werte mit einer Nachkommastelle enthalten sind, bei Summe - Min - Max auf erheblich mehr Nachkommastellen?
    Ich habe den Code schrittweise laufen lassen, dort werden mir die Single-Variablen (korrekt) nur mit einer Nachkommastelle angezeigt.
    Auch in den Zeilen, wo die Werte der Variablen an die Zellen übergeben werden.
    Selbst als Ausgabe in einer Messagebox (nach Übergabe an die Zellen) bekomme ich die korrekten Werte mit einer Nachkommastelle.
    Nur in den Zellen selber wird so ein Murks angezeigt.

    Die Zellen sind im Format Standard.
    Ändere ich dieses Format auf Zahl mit 30 Nachkommastellen, so habe ich in Stichproben bis zu 14 Nachkommastellen Mumpitz gefunden. Danach kommen nur noch Nullen.

    Liegt es also an der Übergabe von Variable zu Zelle?
    Irgendwie verstehe ich die Logik dahinter nicht, denn rein mathematisch kann bei den von mir genannten Berechnungen garnicht eine Ungenauigkeit in der x-ten Nachkommastelle entstehen, weil es immer bei einer Nachkommastelle bleibt.

    *grübel*
     
    fette Elfe, 12. Oktober 2011
    #3
  4. Thomas Ramel MVP für Microsoft Excel

    Excel VBA - Single vs Double - warum andere Ergebnisse?

    Grüezi Achim

    Die Anzahl Nachkommastellen ist nicht mal so ausschlaggebend für die Gleitkomma-Problematik.

    Beim Umrechnen ins Binäre Zahlensystem kommen die Verluste zustande weil es auch dort Werte gibt, die nicht endlich dargestellt werden können (so wie im 10-er System der Bruch 1/3).
    Der Wert 0.1 ist beispielsweise ein solcher - er kann im Dualystem nicht korrekt dargestellt werden und verliert daher etwas an Genauigkeit.
    Beim Zurückwandeln ins 10-er System kann dieser Verlust nicht ausgeglichen werden, daher sind dann die Werte zu klein (sie sind immer zu klein, nie zu gross). Das Ergebnis 13.9 ist um 0.1 kliner als 14 und dürfte somit im Dual-System ebenfalls nicht endlich darstellbar sein.

    Und da der Single-Datentyp eben eine verminderte Genauigkeit aufweist kommen hier die Verluste der Umwandlung schneller zum Tragen.

    Die Ansicht im Lokalfenster/Überwachungsfenster ist für die Beurteilung nicht zu gebrauchen, die stellt nur gerundete Werte dar.


    Ich verwende aus diesen Gründen eigentlich meist nur noch Double und Long als Datentypen.
     
    Thomas Ramel, 12. Oktober 2011
    #4
  5. fette Elfe Erfahrener User
    Hallo Thomas,

    und nochmal danke für die Erklärung.
    Jetzt kann ich mir etwas darunter vorstellen.



    Das ist interessant, weil ich gerade gestern oder vorgestern irgendwo im Netz (keine Ahnung mehr wo), als ich etwas wegen Excel gesucht habe, in etwa folgendes gelesen habe:
    Integer = 16 bit
    Long = 32 bit
    Da inzwischen die meisten (oder alle?) Betriebssysteme 32-bittig sind, und da Arbeitsspeicher und Festspeicher auch nicht mehr so knapp wie früher sind, würde der Vorteil von kleineren Variablen (16-bit) durch den Vorteil der Gleichheit mit dem BS (32-bit) aufgehoben.
    Kurz gesagt, dort wurde geschrieben, dass Long-Variablen inzwischen einen Zeitvorteil gegenüber Integer bieten können, da sie "Gleichbittig" wie das BS sind.
    Deshalb wurde dort auch geraten auf Integer zu verzichten.

    Ob dies bei Double und Single auch einen Unterschied macht, kann ich absolut nicht beurteilen.

    Immerhin erscheint es mir nun sinnvoll, zukünftig auf Integer und Single zu verzichten.


    Gibt es denn noch mehr Variablen-Typen, wo man besser den einen als den anderen Typ benutzen sollte?
     
    fette Elfe, 12. Oktober 2011
    #5
  6. Thomas Ramel MVP für Microsoft Excel
    Grüezi Achim

    Soweit ich weiss wird eine Interger-Variable für die Berechnung in eine Long umgewandelt und anschliessend wieder zurück - daher mein Hinweis meist nur Long zu verwenden.

    Ob es noch andere Variablen-Typen gibt, die ähnlich gelagert sind weiss ich nicht - soooo viele gibts ja auch nicht mehr.
     
    Thomas Ramel, 12. Oktober 2011
    #6
  7. fette Elfe Erfahrener User
    Hallo Thomas,

    es ist immer wieder interessant und lehrreich mit Dir zu schreiben.
    ;O)
     
    fette Elfe, 13. Oktober 2011
    #7
  8. Exl121150 Erfahrener User

    Excel VBA - Single vs Double - warum andere Ergebnisse?

    Hallo Thomas!

    Darf ich dazu anmerken, dass dies nicht immer zutrifft:
    Sind nämlich zB. in einer dyadischen Operation (Multiplikation, Addition, etc.) beide Operanden vom Typ INTEGER, ist auch das interne Zwischenergebnis vom Typ INTEGER. Man kann das mit den beiden simplen SUBs testen:
    Code:
    Sub IntegerTest()
      Dim I As Integer, J As Integer
      Dim L As Long
      I = 1000
      J = 1000
      'Die folgende Zeile produziert einen Überlauf (Err=6),
      'obwohl dies an der Zielvariablen L nicht liegen kann!
      L = I * J
    End Sub
    Sub LongTest()
      Dim I As Integer, J As Long
      Dim L As Long
      I = 1000
      J = 1000
      'Die folgende Zeile läuft korrekt zur Run-Time!
      L = I * J
    End Sub
     
    Exl121150, 14. Oktober 2011
    #8
Thema:

Excel VBA - Single vs Double - warum andere Ergebnisse?

Die Seite wird geladen...
  1. Excel VBA - Single vs Double - warum andere Ergebnisse? - Similar Threads - Excel VBA Single

  2. VBA: Spalten auf anderen Worksheeds in der Mappe ausblenden.

    in Microsoft Excel Hilfe
    VBA: Spalten auf anderen Worksheeds in der Mappe ausblenden.: Hallo zusammen, Eine Tabelle mit 9 Worksheets, Datenblatt, Studien, Studie_1 ...Studie_7. Auf dem Deckblatt werden in Zelle B4-B10 die Namen der Studien eingetragen. Davon abhängig ob ein Name...
  3. Excel VBA Spalten mit Ordnerinhalt vergleichen

    in Microsoft Excel Hilfe
    Excel VBA Spalten mit Ordnerinhalt vergleichen: Hallo, Bin ehr Excel VBA Neuling, Würde aber gerne in einer bestehender Tabelle die Auflistung der Ordner mit dem eigentlichen Stand in den besagten Ordner kontrollieren. Also in der Spalte Q10...
  4. Array aus Excel Tabelle einlesen Word VBA

    in Microsoft Excel Hilfe
    Array aus Excel Tabelle einlesen Word VBA: Hallo, ich benötige in einer Word Datei die Werte einer Excel Datei. Ich würde gerne eine Spalte als Array einlesen. Wie das Array ein lesen in Excel geht weiß ich, aber wie schaffe ich den...
  5. Dynamische Tabellen mit automatischer Aktualisierung

    in Microsoft Excel Hilfe
    Dynamische Tabellen mit automatischer Aktualisierung: Hallo in die Runde! Vorab schon mal vielen Dank für alle Mühen und die Hilfe! Ich habe folgendes Anliegen: Ich habe eine Geräteliste als Excel Datei mit einigen verschiedenen Tabellenblättern...
  6. (Excel) Dynamische Tabelle, VBA, fehlende Formatierung?

    in Microsoft Excel Hilfe
    (Excel) Dynamische Tabelle, VBA, fehlende Formatierung?: Liebe Experten, Gefilterte Daten sollen in ein Listobject übertragen werden. Für das Listobject habe ich ein Template angelegt, dass alle Formatierungen (u.a. bedingte Formatierung etc.) enthält....
  7. Speichern mit dem Titel der Zelle A2

    in Microsoft Excel Hilfe
    Speichern mit dem Titel der Zelle A2: Moin moin, Ich habe per Makro einen Arbeitsablauf aufgezeichnet der soweit auch funktioniert. Dieser Endet jedoch im "Speichern Unter" Fenster, welches durch das Klicken von "Drucken als PDF"...
  8. Excel VBA - Code Hilfe (Spalten, Werte kopieren etc.)

    in Microsoft Excel Hilfe
    Excel VBA - Code Hilfe (Spalten, Werte kopieren etc.): Hallo, ich benötige Hilfe für ein Problem, welches ich leider selbst schwerlich als Anfänger nicht lösen kann: Ich möchte von dem Tabellenblatt "Tabelle1" aus den Zellen B8:B14, K8:K14, B18:B25,...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden