Seite 1 von 1

Variation bei der Anzahl an Nachkommastellen

Verfasst: Mittwoch 6. Juli 2022, 20:50
von cjteclab
Hi Leute,

ich arbeite zur Zeit mit kleinen 'float' Zahlen und bin auf ein Problem gestoßen, welches ich bisher nicht verstehen konnte.

Ich habe folgende Funktion geschrieben:

Code: Alles auswählen

from scipy import constants

def calc_multi_eigenvalues(n_x, n_y, n_z, length_a, length_b, length_c, mass):
    """
    Calculate multiple eigenvalues of a particle in a three-dimensional box
    
    Parameters
    ----------
    n_x, n_y, n_z : 'int'
        principal quantum numbers, with n = 1,2,3,...
    
    length_x, length_y, lenght_z : 'float'
        length of the box in [meter]
    mass : 'float'
        mass of the particle in [kilogram]
        
    Returns
    -------
    calc_multi_eigenvalues : 'dict' ['list', 'float']
        multiple eigenvalues of the particle in [joule]
    """
    eigenvalues = {}
    for i in range (1, n_x+1):
        for j in range(1, n_y+1):
            for k in range(1, n_z+1):
                eigenvalues[i, j, k] = ((constants.h**2 / (8 * mass))
            				* ((i/length_a)**2 + (j/length_b)**2 + (k/length_c)**2))
                            
    return eigenvalues
Wenn ich nun diese Funktion mit den folgenden Werten ausführe:

Code: Alles auswählen

a = 10e-10
b = 10e-10
c = 10e-10
nx = 2
ny = 2
nz = 2
m = constants.m_e

calc_multi_eigenvalues(nx, ny, nz, a, b, c, m)
Erhalte ich das folgende dictionary:

Code: Alles auswählen

{(1, 1, 1): 1.8074002206712706e-19,
 (1, 1, 2): 3.614800441342541e-19,
 (1, 2, 1): 3.6148004413425417e-19,
 (1, 2, 2): 5.422200662013812e-19,
 (2, 1, 1): 3.6148004413425417e-19,
 (2, 1, 2): 5.422200662013812e-19,
 (2, 2, 1): 5.422200662013812e-19,
 (2, 2, 2): 7.229600882685082e-19}
Ich verstehe nicht, weshalb mir bei den Schlüsseln (1, 2, 1) und (2, 1, 1) float-Zahlen (wissenschaftliche Notation) mit 16 Nachkommastellen angezeigt werden, während bei dem Schlüssel (1, 1, 2) eine float-Zahl (wissenschaftliche Notation) mit 15 Nachkommastellen angezeigt wird. Der Wert sollte bei allen drei Zahlen der gleiche sein, wie dies im Gegensatz dazu bei den drei Werten (1, 2, 2), (2, 1, 2) und (2, 2, 1) der Fall ist.

Erhöhe ich die Iteration auf z.B. [ nx, ny, nz = 4 ] zeigt sich das gleiche Problem.

Die Mehrheit aller "gleichen Werte" (Entartung) werden mit der gleichen Anzahl an Nachkommastellen angegeben. Nur bei vereinzelten Werten gibt es eine Abweichung der angegebenen Nachkommastellen.

Woran liegt es, dass nur in vereinzelten Fällen (ohne eine Systematik erkennen zu können) eine abweichende Anzahl an Nachkommastellen berechnet werden?

Mir ist bewusst, dass float-Zahlen nicht unendlich präzise gespeichert werden können und man in diesen Fällen die Möglichkeit hat, auf das Modul "decimal" zurück zu greifen. Aber ich hätte bei einer ungenauen Speicherung von float-Zahlen schlussendlich unterschiedliche Zahlenwerte erwartet. Aber in dem oben beschriebenen Fall unterscheiden sich die Werte nur in der Anzahl der Nachkommastellen. Und nun interessiere ich mich dafür, warum dies so ist.

Ich hoffe, dass ich nicht das Offensichtliche übersehen habe.

Re: Variation bei der Anzahl an Nackommastellen

Verfasst: Mittwoch 6. Juli 2022, 21:22
von Sirius3
Um präzieser zu sein, werden float-Zahlen mit 54bit Genauigkeit gerechnet, und je nachdem in welcher Reihenfolge welche Operation durchgeführt wird, führen "gleiche" Rechnungen zu leicht unterschleidlichen Ergebnissen. Und diese werden zum Schluß in Dezimalzahlen umgewandelt, so dass die Anzahl der Dezimalstellen die 54bit exakt reproduzieren können, und dazu sind halt mal 15 und mal 16 Ziffern nötig.

Eingerückt wird überigens immer mit Leerzeichen, man mischt keine Tabs mit Leerzeichen!