Hex(2^0) = ?

  • Entweder habe ich in der Schule nicht gut genug aufgepasst, oder aber AutoIt rechnet falsch?!

    Hier sollte meiner Meinung nach in beiden Fällen eine 1 bzw. 0x0000000000000001 als Ergebnis kommen, was aber nicht der Fall ist.

    AutoIt
    ConsoleWrite('> 2^0 = ' & 2^0 & @CRLF)
    ConsoleWrite('+ 2^0 = 0x' & Hex(2^0) & @CRLF)

    Ausgabe:

    > 2^0 = 1

    + 2^0 = 0x3FF0000000000000

  • Entweder habe ich in der Schule nicht gut genug aufgepasst, oder aber AutoIt rechnet falsch?!

    Doch, Du hast in der Schule aufgepasst;).

    Wir gehen hier davon aus, dass sowohl die Basis a , als auch der Exponent n natürliche Zahlen (0,1,2,3,4 usw.) sind.

    Dann ist a^n ; mit n=0 immer 1

    Konsolenausgabe :

    Interessant :

    Schreibt man direkt Hex(1) , dann kommt 00000001 heraus.

    Schreibt man aber Hex(2^0) , wobei 2^0 ja 1 ist, dann kommt 3FF0000000000000 heraus.

    Ab Exponenten > 0 läuft alles ! Möglicherweise also wirklich ein Bug der Funktion Hex.

    EDIT :

    Vielleicht wird so klarer was die Ursache ist:

    AutoIt
    ConsoleWrite(Hex(1) & @CRLF)
    ConsoleWrite(Hex(1.0) & @CRLF)

    Dann wäre, unter der Voraussetzung 'natürliche Zahlen', also Hex(Int(2^0)) wohl ok, oder ? Zumindest stimmt das Ergebnis.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (25. November 2017 um 22:11)

  • Nachtragsfrage :

    Vielleicht wird so klarer was die Ursache ist:

    AutoIt
    ConsoleWrite(Hex(1) & @CRLF)
    ConsoleWrite(Hex(1.0) & @CRLF)

    Hex(1) ergibt 00000001

    Hex(1.0) ergibt 3FF0000000000000 , also wie bei Hex(2^0)

    Soweit so klar.

    Warum klappt es aber bei Exponenten > 0 ? Ab Hex(2^1) stimmt es, hier wird 2 und nicht 2.0 verwendet.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Dann wäre, unter der Voraussetzung 'natürliche Zahlen', also Hex(Int(2^0)) wohl ok, oder ?

    Jepp.

    AutoIt berechnet das Ergebnis des Potenz-Operators immer als Double (Edit: siehe Beobachtung von Musashi) da auch zwei Integer (Ganzzahlen) als Operanden Gleitkommazahlen (Rationale Zahlen) als Ergebnis erzeugen können. Nämlich dann wenn der Exponent negativ ist.

    3FF0000000000000 ist hierbei die Binärdarstellung (in hexadezimaler Repräsentation) der Gleitkommazahl 1,0.

    Edit:

    Warum klappt es aber bei Exponenten > 0 ? Ab Hex(2^1) stimmt es, hier wird 2 und nicht 2.0 verwendet.

    Tatsache!
    Finde ich bisschen inkonsequent dieses Verhalten.

    Denke aber mal das dort eine Abfrage drin ist die lautet: Wenn Basis=Integer und Exponent=Integer dann ist Ergebnis ein Integer wenn Exponent > 0 - Ansonsten Float.

    Wahrscheinlich wurde hierbei nicht daran gedacht dass auch bei Exponent 0 das Ergebnis eine Ganzzahl ist.

    2 Mal editiert, zuletzt von AspirinJunkie (25. November 2017 um 22:42)