<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<p>Thanks for the info, this gives me a good start. I started
working on the encoding, as the reading is more complex. I'll
defer on understanding the Cuis code and get it to work right, as
you said.</p>
<br>
<div class="moz-cite-prefix">On 10/12/2017 03:21 PM, Nicolas Cellier
wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CAKnRiT7sidWrB6eB_nL34XHmWkGvcCqcBsVuhER5-LXK9HJyMQ@mail.gmail.com">
<div dir="ltr"><br>
<div class="gmail_extra"><br>
<div class="gmail_quote">2017-10-12 17:46 GMT+02:00 Bert
Freudenberg <span dir="ltr"><<a
href="mailto:bert@freudenbergs.de" target="_blank"
moz-do-not-send="true">bert@freudenbergs.de</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px
0.8ex;border-left:1px solid
rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div
style="font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><span
style="font-family:arial,sans-serif;color:rgb(34,34,34)">On Thu, Oct 12,
2017 at 11:36 AM, Alan Pinch </span><span dir="ltr"
style="font-family:arial,sans-serif;color:rgb(34,34,34)"><<a
href="mailto:alan.c.pinch@gmail.com"
target="_blank" moz-do-not-send="true">alan.c.pinch@gmail.com</a>></span><span
style="font-family:arial,sans-serif;color:rgb(34,34,34)"> wrote:</span><br>
</div>
<div class="gmail_extra">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px
0px 0px 0.8ex;border-left:1px solid
rgb(204,204,204);padding-left:1ex">
<div bgcolor="#FFFFFF">
<p>The same issue exists in ASN1 support, none
for float type tag 9. I would love to add this
support but I am unsure how to breakdown a
float into mantissa, base and exponent. Here
is a description of how ASN1 formats a REAL
into the stream of bytes:<br>
</p>
<blockquote>Type REAL takes values that are the
machine representation of a real number,
namely the triplet (m, b, e), where m is the
mantissa (a signed number), b the base (2 or
10), and e the exponent (a signed number). For
example, the representation of the value 3.14
for the variable Pi, declared as Pi ::= REAL,
can be (314, 10, -2). Three special values,
PLUS-INFINITY, 0, and MINUS-INFINITY, are also
allowed.</blockquote>
Here are some sample values:<br>
<blockquote>
<ul>
<li>09 00 = 0 (zero)</li>
<li>09 01 40 = +INF (infinity)</li>
<li>09 01 41 = -INF</li>
<li>09 08 03 2b 31 2e 30 65 2b 30 =
"+1.0e+0" = 1.0 (exact decimal)</li>
<li>09 05 80 fe 55 55 55 = 1398101.25
(binary, 0x555555 * 2^-2)</li>
<li>09 06 83 00 fc 00 00 01 = 0.0625
(binary, 0x000001 * 2^-4)<br>
</li>
</ul>
</blockquote>
I have not parsed out these samples into these
components so it's greek.</div>
</blockquote>
<div><br>
</div>
<div>
<div
style="font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">Well
it's not the same issue as <span
style="font-family:arial,sans-serif;color:rgb(34,34,34)">ASN.1
float representation is different from IEEE
754 format. To convert a Squeak Float into an
IEEE 64 bit pattern we simply access its
underlying representation, because the VM uses
IEEE internally.</span></div>
<div
style="font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><span
style="font-family:arial,sans-serif;color:rgb(34,34,34)"><br>
</span></div>
<div
style="font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><span
style="font-family:arial,sans-serif;color:rgb(34,34,34)">It sounds like
ASN.1 stores mantissa, base, and exponent
separately. IEEE calls the mantissa
"significand" and that's the name of the
corresponding Squeak method. The exponent is
called "exponent", and the base is implicitly
2:</span></div>
<div
style="font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><span
style="font-family:arial,sans-serif;color:rgb(34,34,34)"><br>
</span></div>
<div>
<div
style="color:rgb(0,0,0);font-family:arial,helvetica,sans-serif;font-size:small">
<div>1398101.25 significand</div>
<div>=> 1.3333332538604736</div>
<div>1398101.25 exponent</div>
<div>=> 20</div>
<div>1.3333332538604736 timesTwoPower: 20</div>
<div>=> 1.39810125e6</div>
<div>1398101.25 = 1.39810125e6</div>
<div>=> true</div>
<div><br>
</div>
</div>
<div
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small">The
IEEE significand/mantissa is normalized to a
fractional number 1 <= m < 2. ASN wants
integral numbers, so you could convert it to
an integer like this:</div>
<div
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small"><br>
</div>
<div>
<div
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small">
<div>x := 1398101.25.</div>
<div>mantissa := x significand.</div>
<div>exponent := x exponent.</div>
<div>base := 2.</div>
<div>[mantissa fractionPart isZero]
whileFalse:</div>
<div><span style="white-space:pre-wrap"> </span>[mantissa
:= mantissa * base.</div>
<div><span style="white-space:pre-wrap"> </span>exponent
:= exponent - 1].</div>
<div>{mantissa asInteger hex. base.
exponent}</div>
<div> #('16r555555' 2 -2)</div>
<div><br>
</div>
</div>
</div>
</div>
<div
style="font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">...
which matches your example.</div>
</div>
<div
style="font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br>
</div>
<div
style="font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">I'm
sure Nicolas will have a much more efficient
formula, but this would work :)</div>
<span class="gmail-m_5888961250713830924HOEnZb"><font
color="#888888">
<div
style="font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)"><br>
</div>
<div
style="font-family:arial,helvetica,sans-serif;font-size:small;color:rgb(0,0,0)">-
Bert -</div>
</font></span></div>
</div>
</div>
<br>
<br>
</blockquote>
<div>make it right > make it fast so it sounds like a
good starting point :)<br>
</div>
<div>since I see a lot of logic in the complex ASN1 spec,
it'll be even worse when reading!</div>
<div>I see nothing about negative zero, nan seems handled by
later version if we can trust SO answers.<br>
</div>
<div>In any case, like requested on SO, a good reference
test database sounds mandatory.<br>
</div>
</div>
<div class="gmail_quote"><br>
</div>
<div class="gmail_quote">We could also peek what Juan did in
Cuis, like:</div>
<div class="gmail_quote"><br>
</div>
<div class="gmail_quote">Float>>exponentPart<br>
"Alternative implementation for exponent"<br>
^self partValues: [ :sign :exponent :mantissa | exponent
]</div>
<div class="gmail_quote"><br>
</div>
<div class="gmail_quote">partValues: aThreeArgumentBlock<br>
^ self<br>
partValues: aThreeArgumentBlock<br>
ifInfinite: [ self error: 'Can not handle infinity'
]<br>
ifNaN: [ self error: 'Can not handle Not-a-Number'
].</div>
<div class="gmail_quote"><br>
</div>
<div class="gmail_quote">partValues: aThreeArgumentBlock
ifInfinite: aZeroOrOneArgBlock ifNaN:
otherZeroOrOneOrTwoArgBlock<br>
"<br>
Float pi hex print<br>
Float pi partValues: [ :sign :exponent :mantissa | {
sign hex. exponent hex. mantissa hex} print ]<br>
0.0 partValues: [ :sign :exponent :mantissa | { sign
hex. exponent hex. mantissa hex} print ]<br>
For 0.0, exponent will be the minimum possible, i.e.
-1023, and mantissa will be 0.<br>
"<br>
| allBits sign exponent mantissa exponentBits
fractionBits |<br>
<br>
" Extract the bits of an IEEE double float "<br>
allBits _ ((self basicAt: 1) bitShift: 32) + (self
basicAt: 2).<br>
<br>
" Extract the sign and the biased exponent "<br>
sign _ (allBits bitShift: -63) = 0 ifTrue: [1] ifFalse:
[-1].<br>
exponentBits _ (allBits bitShift: -52) bitAnd: 16r7FF.<br>
<br>
" Extract fractional part "<br>
fractionBits _ allBits bitAnd: 16r000FFFFFFFFFFFFF.<br>
<br>
" Special cases: infinites and NaN"<br>
exponentBits = 16r7FF ifTrue: [<br>
^fractionBits = 0<br>
ifTrue: [ aZeroOrOneArgBlock
valueWithPossibleArgument: self ]<br>
ifFalse: [ otherZeroOrOneOrTwoArgBlock
valueWithPossibleArgument: self and: fractionBits ]].<br>
<br>
" Unbias exponent: 16r3FF is bias"<br>
exponent _ exponentBits - 16r3FF.<br>
<br>
" Replace omitted leading 1 in fraction if appropriate"<br>
"If expPart = 0, I am +/-zero or a denormal value. In
such cases, no implicit leading bit in mantissa" <br>
exponentBits = 0<br>
ifTrue: [<br>
mantissa _ fractionBits.<br>
exponent _ exponent + 1 ]<br>
ifFalse: [<br>
mantissa _ fractionBits bitOr:
16r0010000000000000 ].<br>
<br>
"Evaluate the block"<br>
^aThreeArgumentBlock value: sign value: exponent value:
mantissa</div>
<div class="gmail_quote"><br>
</div>
<div class="gmail_quote"><br>
</div>
<div class="gmail_quote">
<div>Otherwise, on a 64 bit VM, i would start with
significandAsInteger which is a SmallInteger, and play
with bitShift: 1 - lowbit...</div>
<div>But it would need measurements and is probably a bad
idea in 32bits.<br>
</div>
</div>
</div>
<div class="gmail_extra"><br>
</div>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">
</pre>
</blockquote>
<br>
<pre class="moz-signature" cols="72">--
Thank you for your consideration,
Alan
</pre>
</body>
</html>