Floats und Bits

Floats und Bits

am 20.01.2007 17:14:21 von Jan Teune

Hallo NG,
gibt es in Perl eine schnelle und einfache Möglichkeit, um float-Zahlen
in eine entsprechende 32-Bitfolge zu konvertieren? Beim googeln bin ich
auf zwei Module gestossen, aus denen ich allerdings nicht so wirklich
schlau geworden bin:
Data::SecsPack und Bit::Vector
Die Dokumentationen dazu sind wirklich sehr sehr dürftig...

Falls mir jemand weiterhelfen kann, wäre das super :)

Gruss
Jan und danke im Voraus...

Re: Floats und Bits

am 20.01.2007 17:47:36 von Wolf Behrenhoff

Jan Teune schrieb:
> Hallo NG,
> gibt es in Perl eine schnelle und einfache Möglichkeit, um float-Zahlen
> in eine entsprechende 32-Bitfolge zu konvertieren? Beim googeln bin ich
> auf zwei Module gestossen, aus denen ich allerdings nicht so wirklich
> schlau geworden bin:
> Data::SecsPack und Bit::Vector
> Die Dokumentationen dazu sind wirklich sehr sehr dürftig...

Suchst du folgendes?

$deineZahl=1.5;
print unpack 'b32', $deineZahl;

Wolf

Re: Floats und Bits

am 20.01.2007 19:52:47 von hjp-usenet2

On 2007-01-20 16:47, Wolf Behrenhoff wrote:
> Jan Teune schrieb:
>> Hallo NG,
>> gibt es in Perl eine schnelle und einfache Möglichkeit, um float-Zahlen
>> in eine entsprechende 32-Bitfolge zu konvertieren? Beim googeln bin ich
>> auf zwei Module gestossen, aus denen ich allerdings nicht so wirklich
>> schlau geworden bin:
>> Data::SecsPack und Bit::Vector
>> Die Dokumentationen dazu sind wirklich sehr sehr dürftig...
>
> Suchst du folgendes?
>
> $deineZahl=1.5;
> print unpack 'b32', $deineZahl;

Kaum. Wohl eher

print pack 'f', $deineZahl;

Das produziert Bytes im "native floating point format" also
typischerweise 32 Bit Single Precision IEEE-754 FP, little oder big
endian.

Dein Beispiel produziert den String "100011000111010010101100". Der ist
nur 24 Zeichen lang, und wenn man jede Folge von 8 Zeichen umdreht,
erkennt man, was es ist:

10001100 01110100 10101100
00110001 00100111 00110101
3 1 2 7 3 5
'1' '.' '5'

Es ist der String "1.5", wobei jedes Byte little-endian in Bits
umgewandelt wurde.

hp

--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd

Re: Floats und Bits

am 20.01.2007 20:08:35 von Wolf Behrenhoff

Peter J. Holzer schrieb:
> On 2007-01-20 16:47, Wolf Behrenhoff wrote:
>> Jan Teune schrieb:
>>> Hallo NG,
>>> gibt es in Perl eine schnelle und einfache Möglichkeit, um float-Zahlen
>>> in eine entsprechende 32-Bitfolge zu konvertieren? Beim googeln bin ich
>>> auf zwei Module gestossen, aus denen ich allerdings nicht so wirklich
>>> schlau geworden bin:
>>> Data::SecsPack und Bit::Vector
>>> Die Dokumentationen dazu sind wirklich sehr sehr dürftig...
>> Suchst du folgendes?
>>
>> $deineZahl=1.5;
>> print unpack 'b32', $deineZahl;
>
> Kaum. Wohl eher
>
> print pack 'f', $deineZahl;
>
> Das produziert Bytes im "native floating point format" also
> typischerweise 32 Bit Single Precision IEEE-754 FP, little oder big
> endian.
>
> Dein Beispiel produziert den String "100011000111010010101100". Der ist
> nur 24 Zeichen lang, und wenn man jede Folge von 8 Zeichen umdreht,
> erkennt man, was es ist:
>
> 10001100 01110100 10101100
> 00110001 00100111 00110101
> 3 1 2 7 3 5
> '1' '.' '5'
>
> Es ist der String "1.5", wobei jedes Byte little-endian in Bits
> umgewandelt wurde.

Uups, ja! Du hast natürlich recht. Ich weiß schon, warum ich sehr selten
pack und unpack verwende und normalerweise auch jedes Mal erneut in der
Hilfe nachgucke... Dieses Mal hatte ich das so aus dem Kopf geschrieben
und schnell einmal getestet und da eine Folge von 0en und 1en rauskam,
habe ich gedacht, dass das stimmt. Hätte mir auffallen müssen, dass das
die falsche Repräsentation war :-(

Schande über mich.

Dennoch: ich hatte das so verstanden, dass Jan einen String aus 1 und 0
haben wollte. Den bekommt man durch Kombination von pack und unpack:

print unpack 'b32', pack 'f', $zahl;

So, nun stimmt es aber!

Wolf

Re: Floats und Bits

am 20.01.2007 21:11:53 von Mirco Wahab

Wolf Behrenhoff wrote:
> Uups, ja! Du hast natürlich recht. Ich weiß schon, warum ich sehr selten
> pack und unpack verwende und normalerweise auch jedes Mal erneut in der
> Hilfe nachgucke...

> print unpack 'b32', pack 'f', $zahl;


my $val = 1.11;

my $s = sprintf "%032b", "$val";
my $j = unpack "b*", pack "j" , $val;
my $F = unpack "b*", pack "F" , $val;
my $A = unpack "b*", pack "A*", $val;

print "st: $s\nIV: $j\nNV: $F\nPV: $A\n";


Viele Grüße

M.

Re: Floats und Bits

am 21.01.2007 15:08:02 von Jan Teune

Super,danke schön :)
ich hab mal ein wenig damit rumgespielt, aber wie komm ich denn dann von
der binär-darstellung wieder zu meiner float-zahl?

Danke schonmal im Voraus...
Jan

>
> Dennoch: ich hatte das so verstanden, dass Jan einen String aus 1 und 0
> haben wollte. Den bekommt man durch Kombination von pack und unpack:
>
> print unpack 'b32', pack 'f', $zahl;
>
> So, nun stimmt es aber!
>
> Wolf

Re: Floats und Bits

am 21.01.2007 15:21:40 von Wolf Behrenhoff

Jan Teune schrieb:
> Super,danke schön :)
> ich hab mal ein wenig damit rumgespielt, aber wie komm ich denn dann von
> der binär-darstellung wieder zu meiner float-zahl?

Umgekehrte Reihenfolge von den pack- und unpack-Parametern.

Also:
print unpack 'f', pack 'b32', '00000000000000000000001111111100';

Siehe perldoc -f pack und perldoc -f unpack sowie
http://www.afaik.de/usenet/faq/zitieren/

Wolf