Weil heute Sonntag ist!pillmuncher hat geschrieben:Warum? Oh, warum nur?
funktion ob ergebnis ganzzahl ist
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
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.
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.
- 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!
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.dark123 hat geschrieben: funktioniert nicht. das liefert nämlich immer true.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
ja habs in sage getestet:
das war auch der grund, wieso ich nach einer funktion gesucht habe.
Code: Alles auswählen
definition:
def is_integer(x):
return not x % 1
aufruf:
test = 2/3
is_integer(test)
evaluate:
True
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
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
Andererseits ginge vielleicht auch das hier:Im Übrigen solte man erwähnen, dass floating point Zahlen so verglichen werden sollten:wobei EPSILON passend gewählt werden muss. Entsprechend würde der Code zum Testen von Ganzzahligkeit etwa so aussehen:Auch das kann allerdings in die Hose gehen, wenn EPSILON falsch gewählt wurde.
Code: Alles auswählen
import math
def is_integerish(x):
return math.floor(x) == math.ceil(x)
Code: Alles auswählen
EPSILON = ... # hier bitte ein hinreichend kleines float zuweisen
def feq(x, y):
return abs(float(x)-float(y)) < EPSILON
Code: Alles auswählen
def is_integerish(x):
return feq(x, math.floor(x)) or feq(x, math.ceil(x))
In specifications, Murphy's Law supersedes Ohm's.
wäre
nicht auch eine idee?
demnach
Code: Alles auswählen
>>> a = 4.0000
>>> a == round(a, 0)
True
demnach
Code: Alles auswählen
def is_integer(x):
return x == round(x, 0)
Hmmmm …
Edit: Hab was vergessen:Edit #2: Noch krasserer Unterschied:
Warum man timeit nicht trauen sollte!
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
Code: Alles auswählen
def a(*args):
return timeit.Timer(*args).timeit()
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!