how do I convert a hex to a floating point number

How do I convert a hex to a floating point number? as in 0x43F8E354 should be 497.776

This is SQL Server 2008 R2

I've tried http://www.novicksoftware.com/UDFofWeek/Vol1/T-SQL-UDF-Volume-1-Number-23-fn_replinttobitstring.htm, but it does not look as if fn_replinttobitstring exists in Sql Server 2008 R2.

In SSIS I can do like this:

 Public Function ReadDouble(ByVal blobdata As Byte()) As Double
     ' Convert gain
     Dim MemoryStream As New System.IO.MemoryStream(blobdata)
     Dim BinaryReader As New System.IO.BinaryReader(MemoryStream)
     ReadDouble = BinaryReader.ReadDouble()
 End Function

But how to do this in T-SQL?

more ▼

asked Jul 13, 2011 at 04:03 AM in Default

avatar image

Henrik Staun Poulsen
589 14 17 20

@Henrik Staun Poulsen The function you have in your question does not do what you need even in SSIS because it converts the input to long integer not the floating point number. As @bopeavy already stated in the answer below, conversion to/from int (or bigint) from/to hex is already available in T-SQL. The only problem is that the statement

select convert(bigint, 0x43F8E354)

returns 1140384596 not the desired 497.77600098

Since your input is 4 bytes, 497.77600098 is not an accurate representation of the input. When you declare a variable as float then float(53) is assumed and 8 bytes of storage are needed. If your input is 4 bytes then your output cannot be a default float but is rather a single floating point number, which translates in T-SQL to float(24) and is sometimes called real. This one needs only 4 bytes of storage but the number of significant digits is only 7, so 497.77600098 does not comply with this limitation. Here is the sample showing that default definition of float needs 8 bytes of storage:

declare @f float = 0.0; select datalength(@f);

  • the above returns 8

Please confirm that you need a conversion to float(24)

Jul 13, 2011 at 07:38 AM Oleg

The number 497.76600098 is taken from another tool for which I do not have the source. But I can see that it converts the number to a FLOAT, not a REAL.

I had shown the wrong function. That should be fixed now.

Jul 14, 2011 at 12:11 AM Henrik Staun Poulsen

@Henrik Staun Poulsen I added some comments to my answer related to your SSIS function. I hope they make sense.

Jul 14, 2011 at 08:39 AM Oleg
(comments are locked)
10|1200 characters needed characters left

2 answers: sort voted first

There is a great discussion of this topic on the main SSC site which includes Jeff Moden, Peter Larsson (whom we know as @Peso on this site) and Martin Wills. Here is the link: http://www.sqlservercentral.com/Forums/Topic356756-8-1.aspx. I just tried the version which Martin Wills posted on page 3 which was in turn a recoding of Peter's code. Here is the paste from the post referenced above:

 /* Hats off to Peter Larsson and Martin Wills for this one */
 CREATE FUNCTION dbo.fnBinaryReal2Real
     @BinaryFloat BINARY(4)
     DECLARE  @Mantissa REAL, 
     @Exponent SMALLINT, 
     @IntValue INT, 
     @Real2 REAL        
         @Real2 = CAST(2.0 AS REAL), 
         @IntValue = CAST(@BinaryFloat AS INT),            
         @Exponent = (@IntValue & 0x7f800000) / 0x00800000,            
         @Mantissa = 1.0 + (@IntValue &  0x007FFFFF) * POWER(@Real2, -23)    
     RETURN  SIGN(@IntValue) * @Mantissa * POWER(@Real2, @Exponent - 127)

Here is the test:

 declare @input binary(4) = 0x43F8E354;
 select dbo.fnBinaryReal2Real(@input) result;

Please note that the desired number 497.77600098 is not real (in both senses) because it has way too many digits for a real (a.k.a. float(24)) number to afford. However, if the accurate binary representation 0x43F8E354 of the single floating point number 497.776 is sufficient then the function above should help.


more ▼

answered Jul 13, 2011 at 08:15 AM

avatar image

17.1k 3 7 28

Hi Oleg,

That is two very useful links.

The first link to a function that solves my problem 300%. 100% to be able to decode the value, 100% for something that is fast, and 100% for beeing convertable to a view.

The second link to 26 pages of excellent code. Whoa.

You've made my day. Thank you very much.

Best regards, Henrik

Jul 14, 2011 at 12:21 AM Henrik Staun Poulsen

Hi Oleg,

Bummer, so that is what has been taking our server down... Well, we've noticed a memory leak, but it was so small it did not matter (much (on a 512 GB machine)).

I'll fix that in 3 weeks time, when I'm back from summerholidays.

Again, Thank you very much for your help.

Best regards, Henrik

Jul 14, 2011 at 12:10 PM Henrik Staun Poulsen
(comments are locked)
10|1200 characters needed characters left

This would be a good place for you to start: Convert Hex to int.

more ▼

answered Jul 13, 2011 at 04:30 AM

avatar image

157 2 3 5

yes, I was able to find that link, but not get any use of it.

Jul 14, 2011 at 12:06 AM Henrik Staun Poulsen
(comments are locked)
10|1200 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here



Answers and Comments

SQL Server Central

Need long-form SQL discussion? SQLserverCentral.com is the place.



asked: Jul 13, 2011 at 04:03 AM

Seen: 5228 times

Last Updated: Jul 14, 2011 at 12:03 AM

Copyright 2016 Redgate Software. Privacy Policy