Berechnung, ob ganze Zahl oder nicht

Hallo zusammen.

Ich bin auf der Suche nach einer mathematischen Lösung, um festzustellen, ob eine Zahl eine ganze Zahl ist oder eine Dezimalzahl. Hintergrund ist eine Plausibilitäts-Prüfung, die mir als Ergebnis eine 1 liefert, wenn die Zahl eine Dezimalzahl ist, und eine 0, wenn die Zahl eine ganze Zahl ist.

Weiß jemand, wie man so etwas berechnet?

Vielen Dank für Eure Hilfe

VG
Carsten

Hallo,

in welchem Umfeld möchtest Du diese Prüfung einbauen?

Also Programmiersprache, Excell-Tabelle?

Spontan würde ich vorschlagen, prüfe ob Zahl = Ganzzahl(Zahl) ist, bei Programiersprachen ist oft der Befehl int() oder integer() vorhanden.

Ein Problem können aber schon Rundungsfehler sein, die zu einem falschen Ergebnis führen.

Vlt. hilft es ein bisschen weiter.

Gruß Volker

Hallo,
das könnte man in PostScript mit dem Operator truncate machen.
Man kann aber auch in einer Schleife solange 1 von der Zahl z abziehen, bis das Ergebnis 0). Ist das Ergebnis =0, ist z eine ganze Zahl, sonst eine (nicht ganze) Dezimalzahl.
Ich nehme dabei an, Du willst die Prüfung mit einem Programm durchführen, wenn nicht, müsstest Du mehr Einzelheiten nennen.
Viele Grüße von
Haubenmeise

Hallo Haubenmeise, hallo Volker.

Vielen Dank erstmal für Eure Hilfe.

Ich benötige diese Berechnung tatsächlich in einer Excel-Tabelle. Zurzeit überprüfe ich die Plausibilität mithilfe der Funktion „Rest()“, allerdings würde ich gerne auf die Verwendung von Funktionen verzichten und stattdessen nur mit Wahrheitswerten, Zahlen, Addition, Multiplikation und Division zu arbeiten, was mir bisher auch gelang, aber bei dieser Berechnung stehe ich vor einem Rätsel.

Könnt Ihr mir da weiterhelfen?

VG
Carsten

Hallo Carsten,

allein mit den Grundrechenarten wirst du das auch leider nicht hinbekommen (jedenfalls ist mir kein Weg bekannt). Der Grund ist eigentlich ganz einfach: eine Funktion in mehreren Variablen, wie du sie suchst, die nur aus Addition, Mulitiplikation und Division besteht, ist, außer man teilt durch 0, stetig. Das steht im Widerspruch zur Forderung dass du nur 1 und 0 als Funktionswerte zulässt.

Wenn schon Wahrheitswerte erlaubt sind, dann ja vll auch if-Bedingungen? Dann ist das hier ein viel zu komplizierter Weg (nimm einfach die Rest-Funktion):
Du könntest die größte natürliche Zahl k suchen, so dass k |x|, wenn dann |x|-k > 0 ist x keine ganze Zahl. Wie du diese Zahl findest überlass ich dir (z.B. der Reihe nach durchgehen oder wenn es einr obere Grenze gibt Bisektion, etc.)

Viele Grüße

1 Like

Hallo quazee.

Vielen Dank für Deine Hilfe.

Wenn schon Wahrheitswerte erlaubt sind, dann ja vll auch
if-Bedingungen? Dann ist das hier ein viel zu komplizierter
Weg (nimm einfach die Rest-Funktion):
Du könntest die größte natürliche Zahl k suchen, so dass k |x|, wenn dann |x|-k > 0 ist x keine ganze Zahl.
Wie du diese Zahl findest überlass ich dir (z.B. der Reihe
nach durchgehen oder wenn es einr obere Grenze gibt Bisektion,
etc.)

Das muß ich mir erstmal zu Gemüte führen.
Ich bestehe auch nicht auf ausschließlich Grundrechenarten. Ich denke nur, dass ja hinter der Funktion Rest() irgendeine reine Mathematik stecken muß, die mich interessieren würde.

VG
Carsten

Hallo!

Ich bestehe auch nicht auf ausschließlich Grundrechenarten.
Ich denke nur, dass ja hinter der Funktion Rest() irgendeine
reine Mathematik stecken muß, die mich interessieren würde.

tja, soweit ist es schon gekommen! Wie man Rest(x,y) mit Grundrechenarten berechnet, hat jeder von uns mal gelernt, und zwar in der dritten oder vierten Klasse Grundschule:

2571 : 8 = 321, Rest 3
24
--
 17
 16
 --
 11
 8
 --
 3

Die ganzzahlige Division bzw. der Rest (auf schlau: „Modulo“) ist vom Algorithmus her elemtarer als die Fließkomma-Division. Soll heißen: Das Maschinensprache-Programm für „Rest(x,y)“ ist kürzer als das für „x/y“ (vorausgesetzt Excel ist effizient programmiert).

Michael

Nachtrag:
Das Gesagte gilt nur, wenn x und y ganze Zahlen sind. Wenn es sich um Fließkommazahlen handelt, sieht die Welt schon wieder anders aus.

Wenn es sich um Fließkommazahlen handelt, sieht die Welt schon wieder anders aus.

und wenn ich das Problem richtig verstanden habe, ist dies genau der Fall.

Ich denke nur, dass ja hinter der Funktion Rest() irgendeine reine Mathematik stecken muß, die mich interessieren würde.

Ein Computer rechnet nicht mit symbolischen Ausdrücken, wie man es in der Mathematik macht. Man kann sich überlegen, dass eine relle Zahl x > 0 genau dann eine ganze Zahl ist, wenn

x = \lfloor x \rfloor := \max_{k \in \mathbb Z, k \leq x} k

Das ist das was ich vorhin versucht habe zu beschreiben: man schaut ob x gleich bleibt, wenn man es abrundet. Und wie rundet man ab? Man such die größte ganze Zahl k, die kleinergleich x ist.

Das ist unglaublich ineffektiv und nicht „computergerecht“.
Der Schlüssel ist sich anzuschauen, wie Zahlen in einem Computer repräsentiert werden. Dann wird man feststellen, dass es, da ja der konkrete Wert von x gegeben ist, sehr leicht ist die Nachkommastellen „abzuschneiden“ (also abzurunden). Mehr zu Gleitkommazahlen.

Excel rechnet intern immer mit Doubles. Das Problem ist, dass ich nicht weiß, wie die Funktionen implementiert sind. Tendenziell würde ich sagen, dass Rest() nicht optimal ist, da uns der Rest ja nicht interessiert, sondern nur ob dieser (bei Division durch 1) null ist. Andererseits wüdest du nicht mit Excel arbeiten, wenn es wirklich um Performance ginge (soll heißen du kannst auch ruhig bei Rest bleiben). Ich würde es vermutlich so machen:

=WENN(A1=GANZZAHL(A1); 0; 1)

Viele Grüße

Grüezi zusammen

[Gure Erklärungen gesnippt]

Ich würde es vermutlich so machen:

=WENN(A1=GANZZAHL(A1);0;1)

Wenn wir dir Logik umkehren und die erfolgreiche Prüfung als WAHR ausgeben:

=WENN(A1=GANZZAHL(A1);1;0)

dann kann das auch noch ein wenig gekürzt werden (auch im wahrsten Sinne des Wortes :smile:):

=–(A1=KÜRZEN(A1))

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -
1 Like

Hallo quazee.

da uns der Rest ja nicht interessiert, sondern nur ob dieser (bei
Division durch 1) null ist.

Genau

Vielen Dank für Deine Hilfe.

VG
Carsten

Hallo

tja, soweit ist es schon gekommen! Wie man Rest(x,y) mit
Grundrechenarten berechnet, hat jeder von uns mal gelernt, und
zwar in der dritten oder vierten Klasse Grundschule:

Vielen Dank für diesen Hinweis

2571 : 8 = 321, Rest 3
24

17
16

11
8

3

Diese Art der Berechnung würde ja bedeuten, dass sich hinter der Funktion Rest eine Schleife verbirgt, was dann für mich unbrauchbar wäre.

Carsten

Hallo Thomas.

Wenn wir dir Logik umkehren und die erfolgreiche Prüfung als
WAHR ausgeben:

=WENN(A1=GANZZAHL(A1);1;0)

So herum auch gut, weil ich dann meine Berechnungen direkt mit der Plausibilität multiplizieren kann. Dann ändere die Spaltenüberschift noch von „Plausibilitäts-Fehler“ in „Plausibilität gegeben“ (oder so) und muß halt damit leben, Funktionen zu verwenden (solange sie beim Öffnen der Datei keine Veränderung hevorrufen; Du weißt?)

VG
Carsten

Grüezi Carsten

So herum auch gut, weil ich dann meine Berechnungen direkt mit
der Plausibilität multiplizieren kann. Dann ändere die
Spaltenüberschift noch von „Plausibilitäts-Fehler“ in
„Plausibilität gegeben“ (oder so) und muß halt damit leben,
Funktionen zu verwenden

Ich denke damit lässt sich gut leben - die vorgeschlagene Alternative kommt ja auch mit nur einer Funktion aus :smile:

(solange sie beim Öffnen der Datei keine Veränderung hevorrufen; Du weißt?)

Ja, ich weiss - das tun alle die hier genannten Funktionen nicht.

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

=WENN(A1=GANZZAHL(A1); 0; 1)

Wenn man die Bedingung loswerden will, wie wäre es mit…

=1 - SGN(A1 - Ganzzahl(A1))

Ob das wirklich effizienter ist, wage ich jedoch zu bezweifeln.

Michael

=–(A1=KÜRZEN(A1))

hübsch, wieder was dazugelernt :smile: