I'd recommend using a tool to convert decimal numbers to IEEE floating
point. Doing it by hand is not trivial. Here's one that seems to work:

  https://www.h-schmidt.net/FloatConverter/IEEE754.html

Using that tool, 19.95 (or actually, the closest approximation since
IEEE745 is not exact) is this in floating point IEEE745:

  0x419F999A

- Steve

On 9/30/19 8:40 AM, Costello, Roger L. wrote:
> Thanks again Steve! One more question, please.
> 
>> I think integer + scale for decimals is 
>> relatively uncommon.
>> In the real world binary decimal formats 
>> I've seen just use the standard IEEE float 
>> or double representations.
> 
> Would you mind showing how 19.95 is expressed in the IEEE format, please?
> 
> /Roger
> 
> -----Original Message-----
> From: Steve Lawrence <[email protected]> 
> Sent: Monday, September 30, 2019 8:19 AM
> To: [email protected]
> Subject: [EXT] Re: How are decimal (number with decimal point) values 
> expressed in a binary file?
> 
> Yeah, this system really only works when the scale factor is a constant.
> Which might be common in formats dealing with currencies for example.
> Such formats generally represent values as integers in number of cents so 
> there aren't any issues related to floating point precision loss, but then 
> the int is scaled by 100 to get the actual dollars value when needed.
> 
> But if the scale factor isn't constant, you would need to use inputValueCalc, 
> e.g.:
> 
>   <xs:element name="scaleFactor" type="xs:int" ... />
>   <xs:element name="intValue" type="xs:int" ... />
>   <xs:element name="decValue" type="xs:decimal" dfdl:inputValueCalc="{
>     ../intValue div math:pow(10, ../scaleFactor)
>   }" />
> 
> Though, it might be a nice extension of daffodil to allow 
> dfdl:binaryVirtualDecimalPoint to accept a DFDL expression. Then this could 
> just look like;
> 
>   <xs:element name="scaleFactor" type="xs:int" ... />
>   <xs:element name="decValue" type="xs:decimal"
>     dfdl:binaryDecimalVirtualPoint="{ ../scaleFactor }" />
> 
> From an implementation perspective I don't think it would be difficult to add.
> 
> Though, I think in the real world binary decimal formats I've seen just use 
> the standard IEEE float or double representations. I think integer + scale 
> for decimals is relatively uncommon, and when it does happen, I think the 
> scale tends to be constant.
> 
> - Steve
> 
> On 9/30/19 7:56 AM, Costello, Roger L. wrote:
>> Thank you Steve! One follow-up question, please.
>>
>>> In order to get a value of 19.95, your data would contain the bytes 
>>> 0x07CB (1995 in two's complement binary) and you'd have 
>>> dfdl:binaryDecimalVirtualPoint="2" to move the decimal point two 
>>> places to the left.
>>
>> Is that how most real world data formats express 19.95? If I understand 
>> correctly, the 19.95 is treated as the integer 1995 and then the integer 
>> 1995 is expressed in binary. Then, the data format must, by some means, 
>> indicate that there is a decimal point between 19 and 95. Wouldn't that 
>> information about the location of the decimal point either require some 
>> additional information within the binary file, or some out-of-band knowledge 
>> by the applications that processes the binary file? It seems, based on your 
>> description, you are assuming the latter.
>>
>> /Roger
>>
>> -----Original Message-----
>> From: Steve Lawrence <[email protected]>
>> Sent: Monday, September 30, 2019 7:40 AM
>> To: [email protected]
>> Subject: [EXT] Re: How are decimal (number with decimal point) values 
>> expressed in a binary file?
>>
>> If the type were xs:float or xs:double, then the dfdl:binaryFloatRep 
>> property defines how binary is converted to a number. Daffodil currently 
>> only supports "ieee", which is IEEE 754-1985 floating point representation. 
>> And byte lengths must be 4 for xs:float or 8 for xs:double.
>>
>> Things are a bit different for xs:decimal. In that case, we parse the number 
>> of bits as an integer (based on the dfdl:binaryNumberRep property), and then 
>> move the decimal point of that integer base on the value of 
>> dfdl:binaryDecimalVirtualPoint.
>>
>> So in your example, let's say your field length was 2 bytes and 
>> dfdl:binaryNumberRep="binary" (i.e. two's complement). In order to get a 
>> value of 19.95, your data would contain the bytes 0x07CB (1995 in two's 
>> complement binary) and you'd have dfdl:binaryDecimalVirtualPoint="2" to move 
>> the decimal point two places to the left.
>>
>>
>> On 9/30/19 7:19 AM, Costello, Roger L. wrote:
>>> Hello DFDL community,
>>>
>>> Scenario: The book cost is: 19.95
>>>
>>> The book data is in binary.
>>>
>>> How is 19.95 expressed in binary?
>>>
>>> How would the cost be expressed in a DFDL schema? Simply this:
>>>
>>> <xs:element name="cost" type="decimal" />
>>>
>>> /Roger
>>>
>>
> 

Reply via email to