Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Gleitkommazahlen uebers Netz senden

8 views
Skip to first unread message

Markus Lausser

unread,
Feb 4, 2002, 5:35:34 PM2/4/02
to
Hi.

Gibts nen Standard, wie man Gleitkommazahlen uebers Netz
schickt? Oder am besten: der Sender schickt die Daten,
wie sie im Speicher sind und zusaetzlich Information in
welchem Format sie vorliegen, damit die Daten nur einmal
konvertiert werden muessen. Wie macht man sowas?
In welchem Format koennen doubles vorliegen?
Wie ermittle ich das Format, in dem sie vorliegen?

Markus.

jsaul

unread,
Feb 4, 2002, 5:49:26 PM2/4/02
to
Markus Lausser <lau...@sauron.forwiss.uni-passau.de> wrote:

> Gibts nen Standard, wie man Gleitkommazahlen uebers Netz
> schickt?

man xdr

> In welchem Format koennen doubles vorliegen?

man xdr_double

Gruß, jsaul
--
Der Idiot, der Idiot,
schlug siebenhundertdreiundvierzigtausendzweihundertfünfundsechzig
Fliegen tot.

Felix von Leitner

unread,
Feb 4, 2002, 8:23:49 PM2/4/02
to
Thus spake Markus Lausser (lau...@sauron.forwiss.uni-passau.de):

> Gibts nen Standard, wie man Gleitkommazahlen uebers Netz
> schickt?

Am besten als ASCII. Das funktioniert überall.

> Oder am besten: der Sender schickt die Daten,
> wie sie im Speicher sind und zusaetzlich Information in
> welchem Format sie vorliegen, damit die Daten nur einmal
> konvertiert werden muessen. Wie macht man sowas?

Am besten gar nicht. Es gibt da nicht nur Endianness-Probleme, sondern
es kann auf obskuren Plattformen sogar sein, daß die Maschine ein
natives Fließkommaformat != IEEE hat, und dann hast du einfach mal
verloren.

C99 definiert bei printf %a und %A für eine Hex-ASCII-Repräsentation von
doubles. Allerdings wirst du auf Obskur-Plattformen wahrscheinlich auch
kein C99 haben...

> In welchem Format koennen doubles vorliegen?
> Wie ermittle ich das Format, in dem sie vorliegen?

RTFM

Felix

Christian Weisgerber

unread,
Feb 4, 2002, 8:13:43 PM2/4/02
to
Markus Lausser <sg...@users.sourceforge.net> wrote:

> Gibts nen Standard, wie man Gleitkommazahlen uebers Netz
> schickt?

printf("%e\n", zahl);
Gegebenenfalls mit zusätzlicher Angabe der Präzision. Einfach zu
debuggen, ausgesprochen portabel.

> In welchem Format koennen doubles vorliegen?

64-Bit-IEEE, little oder big endian. Vielleicht auch 32 Bit.
VAX D-, G-Format.

> Wie ermittle ich das Format, in dem sie vorliegen?

Nicht portabel.

Sinnvoller wäre es, das vom anderen Ende her aufzuzäumen, mit der
Frage nach der Anwendung für die diese Werte transportiert werden
sollen.

--
Christian "naddy" Weisgerber na...@mips.inka.de

Sven Geggus

unread,
Feb 5, 2002, 2:40:18 AM2/5/02
to
Markus Lausser <lau...@sauron.forwiss.uni-passau.de> wrote:

> Gibts nen Standard, wie man Gleitkommazahlen uebers Netz
> schickt? Oder am besten: der Sender schickt die Daten,
> wie sie im Speicher sind und zusaetzlich Information in
> welchem Format sie vorliegen, damit die Daten nur einmal
> konvertiert werden muessen.

Nee, so macht man das nicht! Wenn sich zwei Intel Maschinen unterhalten
konvertuieren die halt doppelt.

Ich kenne das jedoch von Ganzzahlen. Da gibts die Network byte Order. Wenn
Du uebers Netz schickst konvertierst Du in eben dieses (ntohl, htonl, ntohs
und htons) und wenn Du vom Netz liest konvertierst Du aus eben dieser.

Fuer Gleitkommazahlen nach IEEE Standard habe ich jetzt auf die schnelle
keine solchen Funktionen gefunden.

Fuer einzelne Werte wuerde ich jedoch grundsaetzlich ASCII Werte verwenden.
Bei Massendaten wie z.B. Messdaten ist das natuerlich vom Durchsatz her
Bloedsinn.

Sven

--
"and on the third day he rebooted into Linux-1.3.84"
(Linus Torvalds, Easter Kernel Release 1996)

/me is giggls@ircnet, http://geggus.net/sven/ on the Web

jsaul

unread,
Feb 5, 2002, 3:44:54 AM2/5/02
to
Sven Geggus <sv...@geggus.net> wrote:

> Fuer Gleitkommazahlen nach IEEE Standard habe ich jetzt auf die schnelle
> keine solchen Funktionen gefunden.

NAME
xdr - library routines for external data representation

SYNOPSIS AND DESCRIPTION
These routines allow C programmers to describe arbitrary
data structures in a machine-independent fashion. Data
for remote procedure calls are transmitted using these
routines.

See also RFC 1014

> Fuer einzelne Werte wuerde ich jedoch grundsaetzlich ASCII Werte
> verwenden. Bei Massendaten wie z.B. Messdaten ist das natuerlich vom
> Durchsatz her Bloedsinn.

Natürlich. Deshalb ja gerade Übertragung von Binärdaten. Und XDR ist ein
*so* alter Hut, das kann doch nicht sein, dass das keiner mehr kennt.

Sven Geggus

unread,
Feb 5, 2002, 5:44:26 AM2/5/02
to
jsaul <news...@jsaul.de> wrote:

> Natürlich. Deshalb ja gerade Übertragung von Binärdaten. Und XDR ist ein
> *so* alter Hut, das kann doch nicht sein, dass das keiner mehr kennt.

1988-02-16 XDR(3N)

autch, das ist für meine Verhältnisse dann doch _zu_ alt, da wusste ich noch
von nix anderem als DOSen.

Man lernt nie aus

Sven

--
The source code is not comprehensible
(found in bug section of man 8 telnetd on Redhat Linux)

Herbert Martin Dietze

unread,
Feb 5, 2002, 7:08:36 AM2/5/02
to
Felix von Leitner <usenet-...@fefe.de> wrote:

> C99 definiert bei printf %a und %A für eine Hex-ASCII-Repräsentation von
> doubles. Allerdings wirst du auf Obskur-Plattformen wahrscheinlich auch
> kein C99 haben...

Das ist in der Tat (noch) ein grosses Problem. Ohne `%a' bleibt
eigentlich nur noch `%e', und das heisst bei MSVC (Schrott,
der leider von vielen benutzt wird), dass es nicht funktioniert,
da die Anzahl der mit [s]printf ausgegebenen Stellen nicht
ausreicht, um auf eine vernuenftige Praezision zu kommen.

Gruss,

Herbert

--
What would happen in a battle between an Enterprise security team, who always
get killed soon after appearing, and a squad of Imperial Stormtroopers, who
can't hit the broad side of a planet? --Tom Galloway
-=-=- -=-=-=-=-
Dipl.Ing. Martin "Herbert" Dietze -=-=- The University of Buckingham -=-=-

Felix von Leitner

unread,
Feb 5, 2002, 7:38:38 AM2/5/02
to
Thus spake Herbert Martin Dietze (her...@spamcop.net):

> > C99 definiert bei printf %a und %A für eine Hex-ASCII-Repräsentation von
> > doubles. Allerdings wirst du auf Obskur-Plattformen wahrscheinlich auch
> > kein C99 haben...
> Das ist in der Tat (noch) ein grosses Problem. Ohne `%a' bleibt
> eigentlich nur noch `%e', und das heisst bei MSVC (Schrott,
> der leider von vielen benutzt wird),

Seit wann müssen wir in de.comp.os.UNIX.programming auf kaputte
Windoze-Compiler Rücksicht nehmen?

jsaul

unread,
Feb 5, 2002, 7:54:11 AM2/5/02
to
Sven Geggus <sv...@geggus.net> wrote:

>> Natürlich. Deshalb ja gerade Übertragung von Binärdaten. Und XDR ist
>> ein *so* alter Hut, das kann doch nicht sein, dass das keiner mehr
>> kennt.
>
> 1988-02-16 XDR(3N)
>
> autch, das ist für meine Verhältnisse dann doch _zu_ alt, da wusste ich
> noch von nix anderem als DOSen.

Ich hätte dem "dass das keiner mehr kennt" sicher einen ;-) verpassen
sollen, denn alter Hut hin oder her, XDR ist ja nicht etwa überholt,
sondern lange etabliert und de facto auf so gut wie allen (nicht "nur"
Unix-artigen) Systemen verfügbar. In Zusammenhang mit diesem Thread
sollte man vielleicht noch die auf XDR aufbauende netCDF-Bibliothek¹
erwähnen, die ist aber evtl. schon "etwas" zu viel des guten...

----
¹) http://www.unidata.ucar.edu/packages/netcdf/

Markus Lausser

unread,
Feb 5, 2002, 10:39:41 AM2/5/02
to
On Tue, 5 Feb 2002 07:40:18 +0000 (UTC), Sven Geggus wrote:
> Markus Lausser <lau...@sauron.forwiss.uni-passau.de> wrote:
>
> > Gibts nen Standard, wie man Gleitkommazahlen uebers Netz
> > schickt? Oder am besten: der Sender schickt die Daten,
> > wie sie im Speicher sind und zusaetzlich Information in
> > welchem Format sie vorliegen, damit die Daten nur einmal
> > konvertiert werden muessen.
>
> Nee, so macht man das nicht! Wenn sich zwei Intel Maschinen unterhalten
> konvertuieren die halt doppelt.
>
> Ich kenne das jedoch von Ganzzahlen. Da gibts die Network byte Order. Wenn
> Du uebers Netz schickst konvertierst Du in eben dieses (ntohl, htonl, ntohs
> und htons) und wenn Du vom Netz liest konvertierst Du aus eben dieser.
>
> Fuer Gleitkommazahlen nach IEEE Standard habe ich jetzt auf die schnelle
> keine solchen Funktionen gefunden.
>
> Fuer einzelne Werte wuerde ich jedoch grundsaetzlich ASCII Werte verwenden.
> Bei Massendaten wie z.B. Messdaten ist das natuerlich vom Durchsatz her
> Bloedsinn.

Hm, und genau solche Massendaten habe ich. Es geht also nicht darum mal kurz
einen double Wert zu uebertragen, sondern das sind ganze Karren solcher
Daten. Was bleibt also? printf mit %a oder %e? Ne, zu (speicher-)aufwendig,
gefaellt mir gar nicht.
xdr? Koennte ne Loesung sein, mal testen...gibt denn sonst wirklich nichts
anstaendiges?
Zumindest auf Intel und Sparcs sollte das ganze funktionieren..

Markus.

Herbert Martin Dietze

unread,
Feb 5, 2002, 11:57:52 AM2/5/02
to
Markus Lausser <lau...@melian.forwiss.uni-passau.de> wrote:

> Hm, und genau solche Massendaten habe ich. Es geht also nicht darum mal kurz
> einen double Wert zu uebertragen, sondern das sind ganze Karren solcher
> Daten. Was bleibt also? printf mit %a oder %e? Ne, zu (speicher-)aufwendig,
> gefaellt mir gar nicht.

Wie waere es mit Kompression? Dazu gibt es doch Bibliotheken.
Dann schickst Du halt einen Byte-Strom uebers Netz, den Du am
anderen Ende dekomprimierst und aus ASCII wieder einliest.

Gruss,

Herbert

--
Chinese is a lousy language for scrabble
-- Neal Stephenson

jsaul

unread,
Feb 5, 2002, 12:15:52 PM2/5/02
to
Markus Lausser <lau...@melian.forwiss.uni-passau.de> wrote:

> On Tue, 5 Feb 2002 07:40:18 +0000 (UTC), Sven Geggus wrote:
>> Fuer Gleitkommazahlen nach IEEE Standard habe ich jetzt auf die
>> schnelle keine solchen Funktionen gefunden.
>>
>> Fuer einzelne Werte wuerde ich jedoch grundsaetzlich ASCII Werte
>> verwenden. Bei Massendaten wie z.B. Messdaten ist das natuerlich vom
>> Durchsatz her Bloedsinn.
>
> Hm, und genau solche Massendaten habe ich. Es geht also nicht darum mal
> kurz einen double Wert zu uebertragen, sondern das sind ganze Karren
> solcher Daten. Was bleibt also? printf mit %a oder %e? Ne, zu
> (speicher-)aufwendig, gefaellt mir gar nicht.

...und außerdem viel zu langsam.

> xdr? Koennte ne Loesung sein, mal testen...gibt denn sonst wirklich
> nichts anstaendiges?

Ich hatte ja schon nebenbei auf netCDF hingewiesen. Dies ist eine
Bibliothek, die im naturwissenschaftlichen Bereich weit verbreitet ist.
Sie basiert natürlich auf XDR, worauf auch sonst? ;) NetCDF hat
Schnittstellen zu C, C++, F77, F90 und was weiß ich noch alles. Und das
Format wird auch von anderer Software unterstützt, z.B. GMT.

Allerdings habe ich selbst bisher nur die reinen XDR-Funktionen
verwendet, was übrigens ganz und gar nicht kompliziert ist:

------------------------------
/* ungefähres Grundgerüst */

#include <stdio.h>
#include <rpc/rpc.h>

FILE *file; /* std stream */
XDR xdr; /* xdr stream */
double *dp, d[NUM];

...

file = fopen (...);
xdrstdio_create (&xdr, file, XDR_ENCODE);
/* Zum Lesen einfach XDR_DECODE nehmen */

i=NUM; dp=d;
while (i--)
xdr_double (&xdr, dp++);

/* es gibt aber auch xdr_array */

...

xdr_destroy (&xdr);
fclose (file);
------------------------------

HTH.

Gruß, jsaul
--
Der Idiot, der Idiot,
schlug siebenhundertdreiundvierzigtausendzweihundertfünfundsechzig
Fliegen tot.

[bis ihm jemand 'ne Kopie von ISO/IEC 9945-2 schenkte]

Ralph Schleicher

unread,
Feb 5, 2002, 1:07:23 PM2/5/02
to
jsaul cited below with "j" writes:

Real name?

j> Ich hätte dem "dass das keiner mehr kennt" sicher einen ;-) verpassen
j> sollen, denn alter Hut hin oder her, XDR ist ja nicht etwa überholt,
j> sondern lange etabliert und de facto auf so gut wie allen (nicht "nur"
j> Unix-artigen) Systemen verfügbar. In Zusammenhang mit diesem Thread
j> sollte man vielleicht noch die auf XDR aufbauende netCDF-Bibliothek¹
j> erwähnen, die ist aber evtl. schon "etwas" zu viel des guten...

netCDF ist auch bei der HDF[1] Library dabei. HDF kann auch
verschiedene native Fließkommadarstellungsformen untereinander
konvertieren.

[1] http://hdf.ncsa.uiuc.edu

--
Ralph

3364 days of Linux experience and counting.

Jochen Lübbers

unread,
Feb 6, 2002, 6:18:18 AM2/6/02
to
jsaul wrote:
> Allerdings habe ich selbst bisher nur die reinen XDR-Funktionen
> verwendet, was übrigens ganz und gar nicht kompliziert ist:

Wir nutzen hier auch für binären Datenaustausch XDR-Funktionen, mit
gutem Erfolg. Deshalb kann ich die Empfehlung nur unterstreichen.

Jochen Lübbers.

--
Jochen Lübbers lueb...@tele-data-electronic.de
Software Development Group I lueb...@tde-online.de
TDE - Tele Data Electronic GmbH s...@tde-online.de
----
"Wer die Freiheit aufgibt, um Sicherheit zu gewinnen,
der wird am Ende beides verlieren" (Benjamin Franklin)

Jochen Lübbers

unread,
Feb 6, 2002, 6:15:45 AM2/6/02
to
Felix von Leitner wrote:
>
> Seit wann müssen wir in de.comp.os.UNIX.programming auf kaputte
> Windoze-Compiler Rücksicht nehmen?
Mir ist einmal (allerdings vor ein paar Jahren) ein C-Compiler
auf SCO über den Weg geleaufen, der sich so merkwürdig anders ver-
hielt als alle C-Compiler die ich bis dahin unter Unix gesehen hatte,
und in der Tat, es war ein Abklastch von MS C V6.0. Sogar die (teils
unsinnigen oder irreführenden) Fehlermeldungen waren identisch :-(
Allerdings wage ich zu hoffen, dass solcherlei Folterwerkzeug auch
bei SCO inzwischen verboten wurde ;-)

Frank Klemm

unread,
Feb 8, 2002, 9:40:02 AM2/8/02
to
On Tue, 5 Feb 2002 01:13:43 +0000 (UTC), Christian Weisgerber <na...@mips.inka.de> wrote:
>Markus Lausser <sg...@users.sourceforge.net> wrote:
>
>> Gibts nen Standard, wie man Gleitkommazahlen uebers Netz
>> schickt?
>
> printf("%e\n", zahl);
> Gegebenenfalls mit zusätzlicher Angabe der Präzision. Einfach zu
> debuggen, ausgesprochen portabel.
>
- sehr schlechte Performance
- Datenverlust möglich (bei %e Datenverlust garantiert)
- Deutliches Vergrößern der zu übertragenden Datenmenge

Ich habe hier z.Z. ein ähnliches Problem und es entsteht knapp ein Terabyte
an Gleitkommazahlen pro Stunde.

--
Frank Klemm

0 new messages