# Decimal Strings and ANSI X3.9 - DICOM

This is a discussion on Decimal Strings and ANSI X3.9 - DICOM ; Hello everybody, I've got a couple of questions concerning the VR DS ("Decimal String") as described in PS 3.5-2008, pp. 24-25.: - Why is the floating point number definition derived from "ANSI X3.9"? Isn't this the FORTRAN standard, which is ...

# Thread: Decimal Strings and ANSI X3.9

1. ## Decimal Strings and ANSI X3.9

Hello everybody,

I've got a couple of questions concerning the VR DS ("Decimal String") as
described in PS 3.5-2008, pp. 24-25.:

- Why is the floating point number definition derived from "ANSI X3.9"?
Isn't this the FORTRAN standard, which is available in different versions
(e.g. X3.9-1966 and X3.9-1978)? These versions even have differences in
floating point representation, as far as I understand from
http://www.fortran.com/fortran/F77_s...-19.html#sh-20

- Is "+.9" a valid DS value? I.e., can the pre-decimal portion of the number
be omitted? X3.9-1978 specifically addresses this issue: "Both the integer
part and the fractional part are strings of digits; either of these parts may
be omitted but not both" (http://www.fortran.com/F77_std/rjcnf-4.html#sh-4.4)
but as far as I understand, X3.9 applies to the exponent only?

- Which of these are valid exponents: "5E-4", "5E4", "5E+4", "5E 4" or all
of them?

It would be great, if someone could help me!
Thanks a lot in advance and best regards,

Winfried

2. ## Re: Decimal Strings and ANSI X3.9

On May 27, 3:05 pm, Winfried Schoech wrote:
> Hello everybody,
>
> I've got a couple of questions concerning the VR DS ("Decimal String") as
> described in PS 3.5-2008, pp. 24-25.:
>
> - Why is the floating point number definition derived from "ANSI X3.9"?
> Isn't this the FORTRAN standard, which is available in different versions
> (e.g. X3.9-1966 and X3.9-1978)? These versions even have differences in
> floating point representation, as far as I understand fromhttp://www.fortran.com/fortran/F77_std/rjcnf0100-sh-19.html#sh-20
>
> - Is "+.9" a valid DS value? I.e., can the pre-decimal portion of the number
> be omitted? X3.9-1978 specifically addresses this issue: "Both the integer
> part and the fractional part are strings of digits; either of these parts may
> be omitted but not both" (http://www.fortran.com/F77_std/rjcnf-4.html#sh-4.4)
> but as far as I understand, X3.9 applies to the exponent only?
>
> - Which of these are valid exponents: "5E-4", "5E4", "5E+4", "5E 4" or all
> of them?
>
> It would be great, if someone could help me!
> Thanks a lot in advance and best regards,
>
> Winfried

19. Following the E or D in an E or D output field, a + or - is
required immediately prior to the exponent field. This improves
compatibility with American National Standard for the Representation
of Numeric Values in Character Strings for Information Interchange,
ANSI X3.42-1975. ANSI X3.9-1966 permitted a blank as a replacement for
+ in the exponent sign.

I would hope no-one actually wrote DS value using the ANSI X3.9-1966
norm (with a space instead of '+' sign), speaking for myself this
would break everywhere (I am internally relying on the C-lib sscanf or
C++ equivalent which assume space is a character separator).

HTH
-Mathieu

3. ## Re: Decimal Strings and ANSI X3.9

Hi

A space is not permitted in a DS as is evident from the fact that
a space is not listed in the "Character Repertoire" of Table 6.2-1
for the Decimal String VR, and the words "embedded spaces are not
allowed" in the Definition column. The definition reads:

"A string of characters representing either a fixed point number or
a floating point number. A fixed point number shall contain only
the characters 0-9 with an optional leading "+" or "-" and an
optional "." to mark the decimal point. A floating point number
shall be conveyed as defined in ANSI X3.9, with an "E" or "e" to
indicate the start of the exponent. Decimal Strings may be padded
with leading or trailing spaces. Embedded spaces are not allowed."

From ANSI X3.9-1978, which is the version listed in PS 3.5 Section 2
Normative References:

"4.3.1 Integer Constant.

The form of an integer constant is an optional sign followed by a
nonempty string of digits. The digit string is interpreted as a
decimal number.

4.4.1 Basic Real Constant.

The form of a basic real constant is an optional sign, an integer part,
a decimal point, and a fractional part, in that order. Both the integer
part and the fractional part are strings of digits; either of these parts
may be omitted but not both. A basic real constant may be written with
more digits than a processor will use to approximate the value of the
constant. A basic real constant is interpreted as a decimal number.

4.4.2 Real Exponent.
The form of a real exponent is the letter E followed by an optionally
signed integer constant. A real exponent denotes a power of ten.

4.4.3 Real Constant.
The forms of a real constant are:

1. Basic real constant
2. Basic real constant followed by a real exponent
3. Integer constant followed by a real exponent

The value of a real constant that contains a real exponent is the
product of the constant that precedes the E and the power of ten
indicated by the integer following the E."

The Fortran reference dates back to 1985 in the original ACR-NEMA
standard in which the definition of ASCII values (section 4.7.1)
specifically specified floating point numbers to be 'as defined
in ANSI X3.9-1978" and to use the upper-case E. I have no idea
who chose this or why, or why they did not reference ANSI X3.42-1975

I would conclude that these are legal:

"+.9"
"5E-4"
"5E4"
"5E+4"

and this is illegal:

"5E 4"

I was gratified to see that my validator reports this as an error:

Error - Value invalid for this VR - (0x0018,0x0081) DS Echo Time DS [0] = <5E 4> - Character invalid for this VR = ' ' (0x20)

David

Mathieu Malaterre wrote:
> On May 27, 3:05 pm, Winfried Schoech wrote:
>> Hello everybody,
>>
>> I've got a couple of questions concerning the VR DS ("Decimal String") as
>> described in PS 3.5-2008, pp. 24-25.:
>>
>> - Why is the floating point number definition derived from "ANSI X3.9"?
>> Isn't this the FORTRAN standard, which is available in different versions
>> (e.g. X3.9-1966 and X3.9-1978)? These versions even have differences in
>> floating point representation, as far as I understand fromhttp://www.fortran.com/fortran/F77_std/rjcnf0100-sh-19.html#sh-20
>>
>> - Is "+.9" a valid DS value? I.e., can the pre-decimal portion of the number
>> be omitted? X3.9-1978 specifically addresses this issue: "Both the integer
>> part and the fractional part are strings of digits; either of these parts may
>> be omitted but not both" (http://www.fortran.com/F77_std/rjcnf-4.html#sh-4.4)
>> but as far as I understand, X3.9 applies to the exponent only?
>>
>> - Which of these are valid exponents: "5E-4", "5E4", "5E+4", "5E 4" or all
>> of them?
>>
>> It would be great, if someone could help me!
>> Thanks a lot in advance and best regards,
>>
>> Winfried

>
> You are talking basically about:
>
> 19. Following the E or D in an E or D output field, a + or - is
> required immediately prior to the exponent field. This improves
> compatibility with American National Standard for the Representation
> of Numeric Values in Character Strings for Information Interchange,
> ANSI X3.42-1975. ANSI X3.9-1966 permitted a blank as a replacement for
> + in the exponent sign.
>
> I would hope no-one actually wrote DS value using the ANSI X3.9-1966
> norm (with a space instead of '+' sign), speaking for myself this
> would break everywhere (I am internally relying on the C-lib sscanf or
> C++ equivalent which assume space is a character separator).
>
> HTH
> -Mathieu

4. ## Re: Decimal Strings and ANSI X3.9

Hello,

> From ANSI X3.9-1978, which is the version listed in PS 3.5 Section 2
> Normative References

Thanks, brilliant hint. I am still learning how to read the DICOM standard
properly... So, X3.9-1978 it is (a little weird from today's perspective :-).

> 4.4.1 Basic Real Constant.
>
> The form of a basic real constant is an optional sign, an integer part,
> a decimal point, and a fractional part, in that order. Both the integer
> part and the fractional part are strings of digits; either of these parts
> may be omitted but not both.

I still think that this description is superior to the "fixed point number"
description in PS 3.5. Maybe one could update the phrases there or "extend"
the X3.9 hint to the fixed point numbers?

For the patient folks I have two more question concerning Decimal Strings:

- As far as I understand from the definition of VR DS, unlimited leading
zeros are permitted? (if the resulting string's length is less than 16 characters)

- The definition in PS 3.5 does not indicate, that the decimal point
position and the presence of "+" signs are significant. I.e., "3.5E-1",
"+3.5E-1", ".35", ".35E0", ".35E+0", ".35E-0" etc. are treated as exactly the
same number. How do you treat this in your software solutions? Do you try to
preserve superfluous elements (signs, leading zeros, E0) and the decimal point
position when editing DS values? Or do you use normalized floating point numbers?

Best regards and have a nice day,

Winfried

5. ## Re: Decimal Strings and ANSI X3.9

> - The definition in PS 3.5 does not indicate, that the decimal point
> position and the presence of "+" signs are significant. I.e., "3.5E-1",
> "+3.5E-1", ".35", ".35E0", ".35E+0", ".35E-0" etc. are treated as
> exactly the same number. How do you treat this in your software
> solutions? Do you try to preserve superfluous elements (signs, leading
> zeros, E0) and the decimal point position when editing DS values? Or do
> you use normalized floating point numbers?

Speaking from a toolkit perspective, DCMTK offers two APIs to read and
write DS elements - one API operates on string and the other one on
binary double-precision floating point numbers. If you use the string
API you will see the sequence of characters as contained in the dataset
(with the option of having non-significant space characters removed automatically),
and if you use the "double" API, the numbers are obviously normalized and can
be compared for equality (as far as this is ever a good idea for floating point
numbers). It is up to the application to choose the API that is best suited
for the particular task in mind. We also have a conversion routine in place
that converts between string and binary represenations and is independent from
the locale setting, which affects for example the character expected and
produced as decimal point when converting.

Regards,
Marco Eichelberg
OFFIS