Ik heb een stream binaire data waarin een 4-bytes float zit verwerkt in het IEEE 754 formaat.
> Wikipedia: IEEE 754-1985
Ik zoek een oplossing om deze 4 bytes, opgeslagen in een string, om te zetten in een float.
Waardes als NaN, -INF en INF moeten bewaard blijven.
pack/unpack zijn niet betrouwbaar omdat de floats per platform kunnen afwijken; althans, dat maak ik op uit de omschrijving "f: float (machine dependent size and representation)".
> http://nl.php.net/manual/en/function.pack.php
Ik heb zelf een functie geschreven; hij werkt niet echt naar behoren:
De resultaten van deze functie zijn: (Input, Output, "Debug")
> Wikipedia: IEEE 754-1985
Ik zoek een oplossing om deze 4 bytes, opgeslagen in een string, om te zetten in een float.
Waardes als NaN, -INF en INF moeten bewaard blijven.
pack/unpack zijn niet betrouwbaar omdat de floats per platform kunnen afwijken; althans, dat maak ik op uit de omschrijving "f: float (machine dependent size and representation)".
> http://nl.php.net/manual/en/function.pack.php
Ik heb zelf een functie geschreven; hij werkt niet echt naar behoren:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| public function readFloat() { //leest 4 bytes $str = $this->readFully(4); //zet bytes om in ints $b0 = ord($str[0]); $b1 = ord($str[1]); $b2 = ord($str[2]); $b3 = ord($str[3]); echo "\r\n".str_pad(decbin($b0<<24|$b1<<16|$b2<<8|$b3), 32, '0', STR_PAD_LEFT); //sign $sgn = ($b0&0x80)>>7; //exponent $exp = (($b0&0x7F)<<1|($b1&0x80)>>7)-0x7F; //fraction $frc = ($b1&0x7F)<<16|$b2<<8|$b3; echo "\r\n".'SGN:'.$sgn.', EXP:'.$exp.', FRC:'.$frc."\r\n"; $float = pow(-1,$sgn)*pow(2,$exp)*(1+$frc); return $float; } |
De resultaten van deze functie zijn: (Input, Output, "Debug")
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| 0 5.87747175411E-39 0000 0000 0000 0000 0000 0000 0000 0000 SGN:0, EXP:-127, FRC:0 1 1 0011 1111 1000 0000 0000 0000 0000 0000 SGN:0, EXP:0, FRC:0 -1 -1 1011 1111 1000 0000 0000 0000 0000 0000 SGN:1, EXP:0, FRC:0 NaN 1.42724803299E+45 0111 1111 1100 0000 0000 0000 0000 0000 SGN:0, EXP:128, FRC:4194304 INF 3.40282366921E+38 0111 1111 1000 0000 0000 0000 0000 0000 SGN:0, EXP:128, FRC:0 -INF -3.40282366921E+38 1111 1111 1000 0000 0000 0000 0000 0000 SGN:1, EXP:128, FRC:0 0.35414314 (random) 873616.25 0011 1110 1011 0101 0101 0010 0100 0000 SGN:0, EXP:-5, FRC:5166302 |
[ Voor 23% gewijzigd door Gamebuster op 09-05-2010 23:32 ]
Let op: Mijn post bevat meningen, aannames of onwaarheden