| In allen Programmiersprachen braucht man Funktionen zum Abschneiden von Gleitkomma-Zahlen. | Dazu dienen die Funktionen ceil(), floor() und int(), die jedoch nicht immer verfügbar sind. |
Algorithmen |
Ausgewählte IT-Rezepte (Ganze Zahlen) |
| Abschneiden | Symmetrische und asymmetrische Varianten |
| Kalkulation | Abschneide-Funktionen in Kalkulations-Programmen, mit Live-Beispiel - Ganzzahl() |
| Basic | Abschneide-Funktionen mit Basic (LibreOffice-Basic, Visual Basic (VBA) - Fix() und Int() |
| Javascript | Abschneide-Funktionen mit Javascript - ceil() und floor() |
| C/C++ | Abschneide-Funktionen mit C/C++ - ceil() und floor() |
| Perl | Abschneide-Funktionen mit Perl - ceil(), floor(), int() |
| PHP | Abschneide-Funktionen mit PHP - ceil() und floor() |
| XSL | Abschneide-Funktionen mit XPath und XSL - ceiling() und floor() |
| Verwandte Themen | Runden zum Rechnen und zur Ausgabe, Rest (Modulo-Funktion) |
Abschneiden |
|
|
Zur Umwandlung von Gleitkomma-Zahlen (z.B. 3.141592) in eine ganze Zahl
kann man sie Runden oder Abschneiden. ● Beim Runden wird die nächst-liegende ganze Zahl zurückgegeben. Die Richtung wird nicht vorgegeben: Runden liefert (je nach den Nachkomma-Stellen) entweder die kleinere oder die größere benachbarte ganze Zahl. ● Beim Abschneiden wird die Richtung vorgegeben, in welcher die nächste ganze Zahl gesucht wird. Es gibt dazu 3 verschiedene Möglichkeiten (rechts) ● Der abgeschnittene Rest wird fallweise durch die Funktion frac() angegeben. |
An dieser Stelle ist eine →
SVG Objekt-Grafik eingebettet. Sie wird von allen modernen Browsern angezeigt. Lediglich
veraltete Versionen des MSIE-Browsern beherrschen kein SVG. Dieser Text wird nur angezeigt,
wenn es Hinweise gibt, dass die SVG-Grafik evtl. nicht angezeigt wird.
Er verschwindet beim Anklicken.
|
Funktion ceil()Diese Funktion liefert immer die nächst-größere ganze Zahl.Beispiel:
ceil(-3.141592) = -3
Der Rest ist immer -1 < r <= 0
ceil(+3.141592) = +4 frac_ceiling(x) = x - ceil(x)
|
Funktion floor()Diese Funktion liefert immer die nächst-kleinere ganze Zahl.Beispiel:
floor(-3.141592) = -4
Der Rest ist immer 0 <= r < +1
floor(+3.141592) = +3 frac_floor(x) = x - floor(x)
|
Funktion symint()Der 'erfundene' Name dieser Funktion wird hier bevorzugt, weil er das Verhalten eindeutig beschreibt:
symint(-3.141592) = -3
Diese Funktion muss man bei Bedarf selbst programmieren.symint(+3.141592) = +3 Der Rest kann -1 > r < +1 betragen frac_sym(x) = x - symint(x)
|
Funktion int()Einige Programmiersprachen bieten diese Funktion. Sie ist nur für Argumente x>0 identisch mit floor() und damit eindeutig.Für Argumente x<0 kann sie sich (je nach Programmiersprache) wie floor() oder wie symint() verhalten !
Achten sie daher bei der Übertragung von Algorithmen auf andere
Programmiersprachen besonders auf diese häufig vorkommende Funktion !
|
Abschneide-Funktionen mit Kalkulations-Programmen |
|||||||||||||||||||||||||||||||||||||||||||||||||
Funktion GANZZAHL()Alle Standard Kalkulations-Programme (LibreOffice-Calc, MS-Excel, ...) bieten diese Funktion.Sie verhält sich wie floor() und liefert immer die nächst-kleinere ganze Zahl. Das Beispiel erzeugt mit jedem Klick auf die Taste F9 in der Zelle B1 eine Zufallszahl im Bereich -5...+5 Darunter werden In Spalte B die 3 Abschneide-Funktionen und in den Spalten C+D die Rest-Berechnung demonstriert. |
Abschneiden von Gleitkomma-Zahlen:
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
Das Beispiel rechts simuliert Live das Verhalten des Kalkulations-Beispiels.
Hier werden - wie im 'echten' Programm - die Daten und nicht die Formeln angezeigt. Klicken sie die Bildschirm-Taste F9 für eine neue Zufallszahl ! Die mehrfache Berechnung von Funktionen wurde in diesem Fall weggelassen. (Die Live-Funktion wird mit einem kleinen ↓ Javascript-Programm ausgeführt, welches im Quelltext dieser Seite enthalten ist). |
Live-Demonstration des Beispiels:
|
||||||||||||||||||||||||||||||||||||||||||||||||
Datum & Zeitwerden intern als Zahlen verwaltet, damit man damit auch rechnen kann. Alle Standard Kalkulations-Programme verwenden dazu das Y1900-System:• Der Skalen-Nullpunkt wird auf 1899-12-31 00:00:00 festgelegt. • Der Skalenwert nimmt pro Tag um +1.0 zu Das bedeutet: • Ganze Zahlen (B1,C1) bezeichnen das Datum (=Tage seit 1899-12-31) • Gleitkomma-Zahlen (B2,C2 bezeichnen Datum + Uhrzeit. • Der Gleitkomma-Rest (B3,C3) bezeichnet die Uhrzeit (in Tages-Bruchteilen) |
Datum und Uhrzeit: Tragen sie diese Formeln ein:
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
Die Funktion Jetzt() liefert Datum und Uhrzeit als
Gleitkomma-Zahl. Daraus kann man mit Funktion Ganzzahl() das Datum und mit Funktion Rest() die Uhrzeit isolieren. |
Umgekehrt kann man eine Datum + Uhrzeit Zahlenwert auch synthetisch erzeugen. Dazu verwendet man meist einen bekannten Zeitpunkt und addiert / subtrahiert die Differenz: +/- 1 pro Tag und +/- 1/24 pro Stunde. |
||||||||||||||||||||||||||||||||||||||||||||||||
Abschneide-Funktionen mit Basic (LibreOffice-Basic, Visual Basic VBA) |
|
|
Ein Interpreter für diese Programmiersprache ist in jedem Standard
Kalkulations-Programm (LibreOffice-Calc,
MS-Excel, ...) enthalten. Da auf den meisten Arbeits-PC mit einem Office-Paket auch ein Kalkulations-Programm installiert ist, kann man Basic einfach und ohne zusätzliche Programme verwenden. |
Basic-Funktionen sind portabel, d.h. man kann den Quelltext der Funktionen ohne Änderung im Basic-Modul jedes Standard Kalkulations-Programm verwenden. |
Funktion Int()Diese Standard Basic-Funktion arbeitet wie floor() und liefert stets die nächst-kleinere ganze Zahl.• Das Beispiel zeigt, wie man damit eine 'Benutzer-definierte Funktion' ceil() zur Verwendung in einem Kalkulations-Programm herstellen kann. • Die Funktion floor() ist in dieser Form sinnlos, weil man sie direkt durch Int() ersetzen kann. Sie wird lediglich zum Vergleich mit den Funktionen anderer Programmiersprachen angeführt. |
Beispiel:
Function ceil(x As Double) As Long
ceil = Int(x) + 1
End FunctionFunction floor(x as Double) As Long floor = Int(x)
End Function
|
Funktion Fix()Diese Standard Basic-Funktion arbeitet symmetrisch, so wie oben unter dem Namen symint() vorgestellt.Damit kann man z.B. eine 'Benutzer-definierte Funktion' symint() zur Verwendung in einem Kalkulations-Programm herstellen. |
Beispiel:
Function symint(x As Double) As Long
symint = Fix(x)
End Function
|
Funktionen CInt() und CLng()Diese Standard-Funktionen zur Typ-Umwandlung runden (!) ein Gleitkomma-Argument auf die nächst-liegende ganze Zahl (auch Argumente x<0).Man kann sie an Stelle der VBA-Funktion Round() verwenden, die in LibreOffice-Basic nicht verfügbar ist. |
Funktion rundet auf ganze Zahlen:
Function my_round0(x as Double) As Integer
♦ Details zum Thema
Runden
my_round0 = CInt(x)
End Function
|
| ● Die Standard-Funktionen Int() und Fix() sind nicht an den Variablen-Typ gebunden. Sie können das Ergebnis nicht nur an Integer, sondern auch an Long oder Double-Variable übergeben. Das ist wichtig zur Verarbeitung von Zahlenwerten >32767 | |
Implizite Typ-UmwandlungAus einem Kalkulations-Programm kannn man an eine Basic-Funktion auch unpassende Zahlenwerte übergeben, z.B. das Argument i=3.1416 an eine Funktion my_test(), obwohl diese ausdrücklich ein ganzzahliges Argument vom Typ Integer verlangt.In diesem Fall werden Gleitkomma-Argumente ungefragt (!) auf die nächste ganze Zahl gerundet. Darauf sollte man sich jedoch nicht verlassen, sondern durch Anwendung einer der Funktionen Int(), Fix(), CInt() genau festlegen, was in einem derartigen Fall geschehen soll. |
Schlechtes Beispiel: Irrtum möglich !
Function my_test(i As Integer)
Anwendungs-Beispiel:
my_test = i
End Function
my_test(4.567) = 5
Besseres Beispiel:
Function my_test(i As Integer)
Anwendung:
my_test = Fix(i)
End Functionmy_test(4.567) = 4
|
| ♦ Details zu Basic und zur Einbindung von Basic-Funktionen in Kalkulations-Programme | |
Abschneide-Funktionen mit Javascript |
|
|
Ein Interpreter für diese Programmiersprache ist in jedem gängigen
Browser-Programm enthalten. Daher kann man Javascript einfach und ohne zusätzliche Programme verwenden. |
Javascript-Programme sind im Quelltext einer Webseite enthalten und zusammen mit der Webseite portabel: Sie funktionieren ohne Änderung auf jedem Betriebssystem und mit jedem gängigen Browser. |
Funktionen ceil() und floor()Javascript bietet diese beiden Standard-Funktionen im Math-Modul.Das Beispiel zeigt, wie man ceil() und floor() anwendet und die Funktionen symint() selbst programmieren kann. Die rechts vereinfacht vorgestellte Funktion js_test() zeigt in einem Alarm-Fenster die Anwendung aller 3 Funktionen auf eine Zufalls-Zahl. Auch das ↑ Kalkulations-Beispiel dieser Seite wird mit einem Javascript-Programm Live simuliert. ♦ Details zur Programmiersprache Javascript |
Live-Demonstration mit einer Javascript-Funktion.Berechnung der Abschneide-Funktionen:
function js_test() {
var z = pst_round(Math.random()*10-5,3);
}var t = "z = "+z; var x = Math.ceil(z); t += "\n ceil(z) = "+x; x = Math.floor(z); t += "\n floor(z) = "+x; x = symint(z); t += "\nsymint(z) = "+x; alert(t); function symint(x) {
var s=Math.floor(x);
}
if(x<0) {s++;} return s; |
Abschneide-Funktionen mit C/C++ |
|
| Man braucht ein → Compiler-Programm zur Übersetzung von C/C++ Quelltext in ein 'Ausführbares Programm' (z.B. auf Windows *.exe). | Der Quelltext der Programmiersprache(n) → C/C++ ist portabel, die damit erzeugten Programme sind jedoch nicht portabel. Man muss für jedes Betriebssystem, teilweise auch für Betriebssystem-Varianten eigene Programme herstellen. |
Funktionen ceil() und floor()C/C++ bietet diese beiden Standard-Funktionen in der Bibliothek <math.h>Das Beispiel zeigt, wie man ceil() und floor() anwendet und die Funktionen symint() selbst programmieren kann. • Die beiden Bibliotheken <math.h>, <stdio.h> werden mit Compiler-Anweisungen eingebunden. • Es folgt die Deklaration der Funktion symint() • Im Programm main() wird die 'test-Zahl' z zur Vereinfachung fix vorgegeben. (Alternative: Berechnung von → Zufalls-Zahlen mit C/C++ • Danach werden die 3 Abschneide-Funktionen (rot) angewendet und jeweils das Ergebnis i mit → Funktion printf() ausgegeben. • Es folgt der Programm-Text der bereits deklarierten Funktion symint() • Zuletzt wird die Funktion modf() vorgestellt. Sie ist ebenfalls in der Bibliothek <math.h> enthalten und gibt den Nachkomma-Teil des Arguments zurück. Der ganzzahlige Teil wird in eine double-Variable (!) geschrieben, die im 2. Argument als Pointer übergeben wird. |
Einfaches, jedoch komplettes
C/C++ Programm zur Demonstration der Abschneide-Funktionen:
#include <math.h>
#include <stdio.h> int symint(double); int main() {
int i;
}double f, xi, z; z = 3.14159265358979; printf("z = %lf\n",z); i = ceil(z); printf("ceil(z) = %d\n",i); i = floor(z); printf("floor(z) = %d\n",i); i = symint(z); printf("symint(z) = %d\n",i); f = modf(z,&xi); printf("modf(z) = %f + %f\n",xi,f); return 0; int symint(double x) {
int i;
} i = floor(x); if(x<0.0) {i++;} return i; |
| ● Der Operator (int) zur Typ-Umwandlung: Gleitkomma -> Ganzzahl arbeitet symmetrisch, d.h. so wie die Funktion symint() |
Typ-Umwandlung double->int
und int->double in C/C++:
i = (int) x;
x = (double) i; |
Abschneide-Funktionen mit Perl |
|
| Der Quelltext von → Perl-Programmen wird in einfachen Text-Dateien (Script-Programmen *.pl) gespeichert und von einem Perl-Interpreter-Programm Live ausgeführt. | Man braucht daher ein (kostenfreies) Interpreter-Programm zur Ausführung eines (portablen) Perl-Script-Programms. |
Funktion int()ist in der Standard → Perl-Distribution enthalten. Sie arbeitet symmetrisch, d.h. so wie die ↑ oben vorgestellte Funktion symint()Funktionen ceil() und floor()sind im Perl-Modul POSIX enthalten, oder werden selbst programmiert.• Das Beispiel rechts beginnt mit der Shebang-Zeile (Angabe des Pfades zum Interpreter-Programm). • Danach folgen die Anweisungen use strict; (immer empfehlenswert) und die Einbindung des POSIX-Moduls. • In der for-Schleife wird eine → Zufallszahl $z erzeugt und danach zur Demonstration aller Abschneide-Funktionen verwendet. Dabei kann man die POSIX-Funktionen ceil(), floor() mit den selbst programmierten Funktionen my_ceil(), my_floor() vergleichen. Letztere kann man immer - auch ohne POSIX-Modul - verwenden. |
Komplettes
→ Perl-Programm zur Demonstration der Abschneide-Funktionen:
#!/usr/bin/perl
use strict; use POSIX; my($i,$x,$z); for($i=0;$i<10;$i++) {
$z = rand()*10-5;
}print "z=$z\n\t"; $x = int($z); print "int(z)=$x, "; $x = ceil($z); print "ceil(z)=$x, "; $x = my_ceil($z); print "my_ceil(z)=$x, "; $x = floor($z); print "floor(z)=$x, "; $x = my_floor($z); print "my_floor(z)=$x \n"; sub my_ceil{
my($x) = @_;
}my($i) = int($x)+1; if($x<0) {$i--;} return $i; sub my_floor {
my($x) = @_;
}
my($i) = int($x); if($x<0) {$i--;} return $i; |
Abschneide-Funktionen mit PHP |
|
| Der Quelltext von → PHP-Programmen wird in einfachen Text-Dateien (Script-Programmen *.php) gespeichert und von einem PHP-Interpreter-Programm Live ausgeführt. |
Man braucht daher ein (kostenfreies) Interpreter-Programm zur Ausführung
eines (portablen) PHP-Script-Programms. Mit PHP-Programmen werden meistens Webseiten hergestellt und von einem → Webserver-Programm verteilt. |
Funktionen ceil() und floor()Sind in jeder PHP Distribution enthalten.Das Beispiel zeigt ihre Anwendung und eine Variante zur Programmierung der Funktion symint(), falls diese benötigt wird. |
<?php
function symint($x) {
if($x>0) {return floor($x);}
}else {return ceil($x);} // Anwendung:
$z = 3.141592;$i = ceil($z); $j = floor($z); $k = symint($z); ?>
|