[AccessD] Single vs. double issue...

MartyConnelly martyconnelly at shaw.ca
Fri Mar 17 18:40:48 CST 2006


MS adheres to IEEE 745 Standard (well mostly) for floating point 
numbers. In some older compilers they
used BCD arithmetic or MSF binary storage format.
There is a formula for number of significant digits obtainable from the 
mantissa size
It is log base 10 (2^ bits in mantissa)
or   using vba calculation with natural logs
Debug.Print (Log(2 ^ 52) / Log(10)) ' double word number of significant 
digits 52 bit mantissa = 15

real*4 sign bit, 8-bit exponent, 23-bit mantissa
real*8 sign bit, 11-bit exponent, 52-bit mantissa
real*10 sign bit, 15-bit exponent, 64-bit mantissa

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vccelng4/html/elconTypedouble.asp


DJK(John) Robinson wrote:

>Nothing to do with MS - time to ring *your* bell, guys!  :-)
>
>A single has 32 bits: 24 for the mantissa, 8 for the exponent.  The exponent
>determines the *range* of values you can have, while the mantissa determines
>the *precision*, and each has effectively to use one bit for its sign.  So,
>with 23 bits of mantissa to provide the precision, how many significant
>decimal digits does that represent?  About 7.  (Strictly speaking, a little
>less than 7, since 2**23 = 8,388,608, not 9,999,999.)
>
>So a 32-bit floating-point number (a 'single') CANNOT represent 666,656,666
>in all its *nine*-significant-digit glory.  Nothing to do with Access, nor
>even MS:  just math.  (The 24/8 split could in theory be chosen differently,
>but 24/8 is the IEEE standard, widely used.)
>
>The Access documentation alludes to this degree of precision in the number
>of significant digits it shows in its definition of single: just 7.
>
>Incidentally, Bobby, it's not decimal *values* you're storing, just values -
>which you may think of in decimal representation.  There's a serious
>question here:  are your actual values here integers, or do they have a
>fractional part?  If integers, then of course you should not be using
>floating-point at all, both for efficiency of storage and speed of
>calculation.
>
>The 64 bits of a double are split 52/11.
>
>HTH
>John
>
>
>-----Original Message-----
>From: accessd-bounces at databaseadvisors.com
>[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Heenan, Lambert
>Sent: 17 March 2006 20:17
>To: 'Access Developers discussion and problem solving'
>Subject: Re: [AccessD] Single vs. double issue...
>
>
>The difference between Single and Double is not just the number of decimal
>places, but also the range of values to the left of the decimal point.
>
>A Single can store -3.402823E38 to -1.401298E-45 for negative values and
>from 1.401298E-45 to 3.402823E38 for positive values. 
>
>A Double can store -1.79769313486231E308 to -4.94065645841247E-324 for
>negative values and from 4.94065645841247E-324 to 1.79769313486232E308 for
>positive values. 
>
>That's the official word. I just tested what you report and can confirm that
>singles in a table are doing this very strange 'rounding'. It also happened
>when you use Single type variables in code. It makes no sense at all to me
>as 666,656,666 is only ~6.66E8, well within the supposed range of a Single.
>
>So at first blush this is a VERY SERIOUS bug in the Single data type!!!!!!!
>
>Anyone care to ring the bell at M$?
>
>Lambert
>
>-----Original Message-----
>From: accessd-bounces at databaseadvisors.com
>[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Bobby Heid
>Sent: Friday, March 17, 2006 2:54 PM
>To: 'Access Developers discussion and problem solving'
>Subject: [AccessD] Single vs. double issue...
>
>
>Hey,
>
>I always thought that the main difference between a single and a double was
>that the single had 7 digits  and the double had 15 digits of precision
>AFTER the decimal point.
>
>Normally, I store decimal values as double.  But for some reason, this
>particular field was set to single.  Our client found an issue with that
>field today.  They had entered 666,656,666 into the field.  When you look at
>the table, it is 666,656,600.
>
>As a test, I changed the field to double, entered 666,656,666, and saved it.
>The value stuck.  Then I changed it to single, got the smaller field size
>warning, and saved it.  When I looked at the table, the value was
>666,656,600.
>
>So, I think the issue is that I misunderstood what the precision meant in
>the single vs. double declaration.  I wanted to be sure that this was the
>issue before I just blindly convert them to doubles.  Am I correct?
>
>Thanks,
>Bobby
>
>  
>

-- 
Marty Connelly
Victoria, B.C.
Canada






More information about the AccessD mailing list