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.
> 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.
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
> 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
> 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
> 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.
> 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)
> 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 -=-=-
Seit wann müssen wir in de.comp.os.UNIX.programming auf kaputte
Windoze-Compiler Rücksicht nehmen?
>> 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/
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.
> 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
> 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]
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.
--
Ralph
3364 days of Linux experience and counting.
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)
Ich habe hier z.Z. ein ähnliches Problem und es entsteht knapp ein Terabyte
an Gleitkommazahlen pro Stunde.
--
Frank Klemm