Font
[thread]7508[/thread]

Hexadezimale Fließkommazahl umwandeln: wie wandle ich hex float in dez float?



<< >> 8 entries, 1 page
CommSter
 2005-11-29 14:16
#60551 #60551
User since
2005-11-29
4 articles
BenutzerIn
[default_avatar]
Hallo,

kann man in Perl auf "einfache" Weise eine hexadezimale Fließkommazahl als dezimale darstellen?

Ich habe z.B. eine hex-Zahl 4361B6EF
und das ist 225.71458 dezimal dargestellt.

Wie kann ich bei Eingabe eine hex Fließkommazahl die dezimal darstellen???

Ich hab' schon mit pack/unpack, sprintf etc. rumprobiert, aber kam nie zum Ergebnis.
Ich habe auch schon bitweise versucht das zu lösen indem ich den Exponenten und die Mantisse gesplittet habe, kam da aber auch irgendwann nicht mehr weiter!

Bitte helft mir.

Gruß CommSter
pq
 2005-11-29 14:23
#60552 #60552
User since
2003-08-04
12207 articles
Admin1
[Homepage]
user image
perldoc -f hex
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
CommSter
 2005-11-29 14:29
#60553 #60553
User since
2005-11-29
4 articles
BenutzerIn
[default_avatar]
meinst Du?

print hex '4361b6ef';

dann wird das als hex int interpretiert und nicht als fließkomma
und gibt 1130477295 aus.\n\n

<!--EDIT|CommSter|1133267465-->
Taulmarill
 2005-11-29 15:01
#60554 #60554
User since
2004-02-19
1750 articles
BenutzerIn

user image
Code: (dl )
1
2
> perl -e 'print unpack "f", pack "H*", "4361B6EF";'
225.714584350586

beachte aber, dass die bitlänge von floatingpoint-variablen wie hier bei pack benutzt von der maschiene auf der das script läuft abhängt.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
CommSter
 2005-11-29 15:14
#60555 #60555
User since
2005-11-29
4 articles
BenutzerIn
[default_avatar]
[quote=Taulmarill,29.11.2005, 14:01]
Code: (dl )
1
2
> perl -e 'print unpack "f", pack "H*", "4361B6EF";'
225.714584350586
[/quote]
Was muss ich tun, damit es bei mir klappt?

Bei mir gibt das obige Kommando
-1.12887707981084e+29
als Ergebnis aus.

Die Bitlaenge von float ist doch immer 32?
1.Bit -> Vorzeichen
2.-9.Bit -> Exponent
10.-32.Bit -> Mantisse

Mein System: Linux (Debian)
Version: 2.4.27-2-686
Maschine: i686\n\n

<!--EDIT|CommSter|1133337386-->
CommSter
 2005-11-30 13:07
#60556 #60556
User since
2005-11-29
4 articles
BenutzerIn
[default_avatar]
Hallo,

danke für die Antwort.
Ich musste bei mir aber die Bytes vertauschen.

Die Zeile
Code: (dl )
print unpack "f", pack "H*", "EFB66143";

ergibt bei mir nun auch 225,714... :-)

Gruß CommSter
esskar
 2005-11-30 15:19
#60557 #60557
User since
2003-08-04
7321 articles
ModeratorIn

user image
liegt aber wohl an deinem System (windows)...
auf anderen systemen kann es anders sein... du musst vorher checken, ob dein system little- oder bid-endian ist
Taulmarill
 2005-11-30 15:44
#60558 #60558
User since
2004-02-19
1750 articles
BenutzerIn

user image
[quote=CommSter,29.11.2005, 14:14]Die Bitlaenge von float ist doch immer 32?
1.Bit -> Vorzeichen
2.-9.Bit -> Exponent
10.-32.Bit -> Mantisse[/quote]
das ist hochgradig maschienenabhängig. schau dir mal den wikipediaeintrag dazu an =>http://de.wikipedia.org/wiki....technik

wenn du das maschienenunabhängig haben willst, musst du's wohl per hand machen, oder ein passendes modul dafür finden.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< >> 8 entries, 1 page



View all threads created 2005-11-29 14:16.