funktion ob ergebnis ganzzahl ist

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

pillmuncher hat geschrieben:Warum? Oh, warum nur? :?
Weil heute Sonntag ist! :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
dark123
User
Beiträge: 4
Registriert: Sonntag 15. Januar 2012, 16:18

stimmt. das y brauch ich nicht.
und die return true bwz false kann ich mir auch sparen. hab das alles nur
schnell geschrieben ohne gross nachzudenken :-)

nur:

def is_integer(x):
return not x % 1


funktioniert nicht. das liefert nämlich immer true.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bitte verwende doch die Code-Tags, wenn Du Quellcode postest. Für Python-Code die speziellen Python-Code-Tags!
dark123 hat geschrieben: funktioniert nicht. das liefert nämlich immer true.
Bei mir klappt es. Wie hast Du das getestet? Die einzige Erklärung wäre die, dass `sage` anders castet, als ein normales Python das tun würde.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
dark123
User
Beiträge: 4
Registriert: Sonntag 15. Januar 2012, 16:18

ja habs in sage getestet:

Code: Alles auswählen


definition:
def is_integer(x):
    return not x % 1

aufruf:

test = 2/3
is_integer(test)

evaluate:
        	
True

das war auch der grund, wieso ich nach einer funktion gesucht habe.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Weißt du, was Sage berechnet, wenn du 2/3 schreibst? :) Das ist eine Ganzzahl-Division, und weil die drei nicht in die zwei passt, kommt dabei null raus. Wenn du wirklich zwei drittel berechnen willst, musst du mindestens eine der Zahlen als float angeben:

Code: Alles auswählen

In [1]: 2/3
Out[1]: 0

In [2]: 2.0/3
Out[2]: 0.6666666666666666
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Andererseits ginge vielleicht auch das hier:

Code: Alles auswählen

import math

def is_integerish(x):
    return math.floor(x) == math.ceil(x)
Im Übrigen solte man erwähnen, dass floating point Zahlen so verglichen werden sollten:

Code: Alles auswählen

EPSILON = ... # hier bitte ein hinreichend kleines float zuweisen

def feq(x, y):
    return abs(float(x)-float(y)) < EPSILON
wobei EPSILON passend gewählt werden muss. Entsprechend würde der Code zum Testen von Ganzzahligkeit etwa so aussehen:

Code: Alles auswählen

def is_integerish(x):
    return feq(x, math.floor(x)) or feq(x, math.ceil(x))
Auch das kann allerdings in die Hose gehen, wenn EPSILON falsch gewählt wurde.
In specifications, Murphy's Law supersedes Ohm's.
JustinJ
User
Beiträge: 14
Registriert: Sonntag 15. Januar 2012, 15:59

wäre

Code: Alles auswählen

>>> a = 4.0000
>>> a == round(a, 0)
True
nicht auch eine idee?


demnach

Code: Alles auswählen

def is_integer(x):
    return x == round(x, 0)
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Hmmmm …

Code: Alles auswählen

In [9]: a('round(1.234, 0) == 1.234')
Out[9]: 2.1165199279785156

In [10]: a('int(1.234) == 1.234')
Out[10]: 0.423098087310791
Edit: Hab was vergessen:

Code: Alles auswählen

def a(*args):
    return timeit.Timer(*args).timeit()
Edit #2: Noch krasserer Unterschied:

Code: Alles auswählen

In [11]: a('not 1.234 % 1')
Out[11]: 0.05470418930053711 # ca. 38,7× schneller :D
;)

Warum man timeit nicht trauen sollte!
Antworten