Seite 1 von 2

Re: funktion ob ergebnis ganzzahl ist

Verfasst: Sonntag 15. Januar 2012, 17:36
von Hyperion
pillmuncher hat geschrieben:Warum? Oh, warum nur? :?
Weil heute Sonntag ist! :mrgreen:

Re: funktion ob ergebnis ganzzahl ist

Verfasst: Sonntag 15. Januar 2012, 17:41
von dark123
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.

Re: funktion ob ergebnis ganzzahl ist

Verfasst: Sonntag 15. Januar 2012, 17:47
von Hyperion
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.

Re: funktion ob ergebnis ganzzahl ist

Verfasst: Sonntag 15. Januar 2012, 18:04
von dark123
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.

Re: funktion ob ergebnis ganzzahl ist

Verfasst: Sonntag 15. Januar 2012, 18:06
von nomnom
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

Re: funktion ob ergebnis ganzzahl ist

Verfasst: Sonntag 15. Januar 2012, 18:18
von pillmuncher
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.

Re: funktion ob ergebnis ganzzahl ist

Verfasst: Sonntag 15. Januar 2012, 18:27
von JustinJ
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)

Re: funktion ob ergebnis ganzzahl ist

Verfasst: Sonntag 15. Januar 2012, 18:29
von nomnom
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!