- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Has anyone seen an algorithm which can reliably determine the data type (float or integer) of a variable based on its value. For example, a utility subroutine which outputs/prints array values. The arrays are of both Int*4 and Real*8 and some of the arrays of type Real*8 contain integer values in some, but not all, locations. For instance, the real*8 array may contain decimal 281 in the form Z"00000119". An added complexity is that the code should ideally run on DEC ALPHA running OpenVMS as well as PC running DVF 6.6 (UNIX portability would be nice as well). I have looked at the EXPONENT and FRACTION intrinsics. The current algorithm involves equivalencing a Real*8 and a Integer*4 and then evaluating the Integer's bit patterns and making some assumptions such as a float will contain TRUE bits in the exponent field. The problem is that the 2 platforms have different float data representations and the PC holds the exponent field in the Most Significant 32 Bits while the DEC holds them in the 32 LSB. Therefore, on the PC, the equivalenced integer does not capture the exponent fields from the Real*8.
Link Copied
3 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
If you compile on Alpha with /FLOAT=IEEE, your life will be much easier, as then the same float representation will be used as on the PC.
Steve
Steve
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I don't think a general determination is possible. Most
any set of 4 bytes would make a perfectly good integer
OR real number. However, if you know the range that
your real or integer variable should fall within, you
can use that to make a determination. I have a case
where early versions of a binary file contained a 4 byte
integer, and later versions of the same file type have
a 4 byte real. Knowing that the variable should fall
in the range 0 to 1000, I read the ambiguous data into a 4 byte integer and check the range. If the data is actually the real version, the value of the integer variable will be huge, due to the placement of the exponent bits in the IEEE format, and I can use an equivalenced real variable instead to get the correct value.
any set of 4 bytes would make a perfectly good integer
OR real number. However, if you know the range that
your real or integer variable should fall within, you
can use that to make a determination. I have a case
where early versions of a binary file contained a 4 byte
integer, and later versions of the same file type have
a 4 byte real. Knowing that the variable should fall
in the range 0 to 1000, I read the ambiguous data into a 4 byte integer and check the range. If the data is actually the real version, the value of the integer variable will be huge, due to the placement of the exponent bits in the IEEE format, and I can use an equivalenced real variable instead to get the correct value.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for the replies,
I agree with your point ( /FLOAT=IEEE ), however, the current problem arises from a port to the PC. This code has been running on the DEC ALPHA for years and many post-processing tools have been developed which assume /FLOAT=VAXG or /FLOAT=VAXD.
I am currently writing platform specific logic and implementing it with the IF Directive Construct
cDEC$ IF DEFINED ( _WIN32 )
PC code
cDEC$ ELSE
DEC ALPHA code
cDEC$ ENDIF
I agree with your point ( /FLOAT=IEEE ), however, the current problem arises from a port to the PC. This code has been running on the DEC ALPHA for years and many post-processing tools have been developed which assume /FLOAT=VAXG or /FLOAT=VAXD.
I am currently writing platform specific logic and implementing it with the IF Directive Construct
cDEC$ IF DEFINED ( _WIN32 )
PC code
cDEC$ ELSE
DEC ALPHA code
cDEC$ ENDIF
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page