> Number (which I think is based on a standard implementation of float?)
An AS3 'Number' is what Java and C++ call a 'double'. A Java or C++ 'float' has only 32-bits instead of 64-bits, which means that it stores floating-point values with fewer significant digits (6 or 7, I think) and a smaller exponent range. AS3 doesn't have this 32-bit floating-point type. The IEEE Standard for Binary Floating-Point Arithmetic (IEEE 754) defines the behavior of these datatypes, and modern microprocessors implement them in hardware. Gordon Smith Adobe Flex SDK Team ________________________________ From: flexcoders@yahoogroups.com [mailto:[EMAIL PROTECTED] On Behalf Of Daniel Freiman Sent: Friday, June 13, 2008 1:05 PM To: flexcoders@yahoogroups.com Subject: Re: [flexcoders] Re: Math.abs() Limitation? That's the explanation I've been looking for. I think we were really close to it a few times and just missed it (for example the "not enough precision" comment). So this isn't a bug as much as a limitation of the definition of Number (which I think is based on a standard implementation of float?). The original problem should have been that i was getting: Math.abs(Number.MAX_VALUE - 1290) == Math.abs(Number.MAX_VALUE - 1284); // returns true I wounder if I only imagined Math.abs() making a difference (I thought I tested the difference)? Either way, int.MAX_VALUE has been working so I'm happy. Thanks, - Daniel Freiman On Fri, Jun 13, 2008 at 3:43 PM, Gordon Smith <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> > wrote: Now that you're using Number.MAX_VALUE rather than int.MAX_VALUE, this difference *should* evaluate to 0. The reason is that Number.MAX_VALUE is a huge value, approximately 1.79769313486231e+308, with 309 digits to the left of the decimal point. Number, being only 64 bits, can't represent all of these... it represents the 15 or 16 most-significant digits, with an exponent telling where the decimal point goes. The next-to-the-maximum value that Number can represent is something like 1.79769313486230e+308, where the least-significant of the digits stores is a 0 instead of a 1. (Actually they're stored in binary, not decimal, but that's another story.) So when you subtract a puny value like 1290, it's like doing 179769313486231??????????????????????????????????????????????...???? -1290 ------------------------------------------------------------------------ --------------------------------------------- 179769313486231??????????????????????????????????????????????...???? You get the same thing you started with, because the mathematically exact result is closer to the maximum value than to the next-to-the-maximum value of Number. If you subtract a much larger value like 1e+294 you'll start affecting the least significant digit. Gordon Smith Adobe Flex SDK Team ________________________________ From: flexcoders@yahoogroups.com <mailto:flexcoders@yahoogroups.com> [mailto:flexcoders@yahoogroups.com <mailto:flexcoders@yahoogroups.com> ] On Behalf Of Daniel Freiman Sent: Friday, June 13, 2008 12:26 PM To: flexcoders@yahoogroups.com <mailto:flexcoders@yahoogroups.com> Subject: Re: [flexcoders] Re: Math.abs() Limitation? I'll have to double check, but I'm don't think the code was doing the right thing either, because: Math.abs(Number.MAX_VALUE - 1290) - Math.abs(Number.MAX_VALUE - 1284); // returns 0 On Fri, Jun 13, 2008 at 1:58 PM, Mike Morearty <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> > wrote: Daniel, this is a bug in Flex Builder, which occurs when displaying the values of Numbers whose value is greater than 0x7FFFFFFFFFFFFFFF. I'll get a fix in ASAP. Thanks for the feedback, and sorry for the inconvenience. To be clear, the Flex Builder debugger's Variables view is showing the wrong value, but the code is doing the right thing, and trace() is showing the right thing. - Mike Morearty, Adobe Flex Builder team --- In flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> , "Daniel Freiman" <[EMAIL PROTECTED]> wrote: > > What did I mean? I'm not sure. For some reason I thought that floats loose > precision at near the end of their range, but even if that is true, that > wouldn't explain the lose of precision that large. In any event, I retried > the following code: > > var t1:Number = Number.MAX_VALUE; > var t3:Number = Number.MAX_VALUE - 1290; > var t4:Number = Number.MAX_VALUE - 1284; > var t5:Number = Math.abs(Number.MAX_VALUE - 1290); > var t6:Number = Math.abs(Number.MAX_VALUE - 1284); > > var a1:Number = t3 - t4; > var a2:Number = Math.abs(t3 - t4); > var a3:Number = t5 - t6; > var a4:Number = (Number.MAX_VALUE - 1290) - (Number.MAX_VALUE - > 1284); > var a5:Number = Math.abs(Number.MAX_VALUE - 1290) - > Math.abs(Number.MAX_VALUE - 1284); > var a6:Number = Math.abs((Number.MAX_VALUE - 1290) - > (Number.MAX_VALUE - 1284)); > > > The debugger reported all of the first group of variable values as > "9223372036854775807 [0x7fffffffffffffff]" and the traces of these values > reported all of the values as "1.79769313486231e+308" > This is not the same results that I remember getting previously where t3 != > t4. The second group all have values of 0. When i have time I'll look into > this more. > > - Daniel Freiman > > On Wed, Jun 11, 2008 at 2:04 AM, Gordon Smith <[EMAIL PROTECTED]> wrote: > > > > Number.MAX_VALUE doesn't have enough precision to handle what I was > > trying to do. > > > > What do you mean by this? A Number, being 64 bits, actually has both more > > precision and more range than int, which is 32 bits. For example, in > > addition to storing fractional values, it can store integers much larger > > than int.MAX_VALUE. > > > > > > > > Gordon Smith > > > > Adobe Flex SDK Team > > > > > > ------------------------------ > > > > *From:* flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> [mailto:flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> ] *On > > Behalf Of *Daniel Freiman > > *Sent:* Friday, June 06, 2008 2:10 PM > > *To:* flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> > > *Subject:* Re: [flexcoders] Math.abs() Limitation? > > > > > > > > I figured it out. The trace made it obvious (as opposed the debugger which > > is what I was previously using). I was using Number.MAX_VALUE, not > > int.MAX_VALUE. Number.MAX_VALUE doesn't have enough precision to handle > > what I was trying to do. > > > > Thanks, > > > > - Daniel Freiman > > > > On Fri, Jun 6, 2008 at 2:29 PM, Gordon Smith <[EMAIL PROTECTED]> wrote: > > > > What do you get when you trace out the following values? > > > > > > > > int.MAX_VALUE - 1290 > > > > Math.abs(int.MAX_VALUE - 1290) > > > > int.MAX_VALUE - 1284 > > > > Math.abs(int.MAX_VALUE - 1284) > > > > > > > > Gordon Smith > > > > Adobe Flex SDK Team > > > > > > ------------------------------ > > > > *From:* flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> [mailto:flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> ] *On > > Behalf Of *Alex Harui > > *Sent:* Friday, June 06, 2008 11:18 AM > > *To:* flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> > > *Subject:* RE: [flexcoders] Math.abs() Limitation? > > > > > > > > What if you use temporary variables? > > > > > > ------------------------------ > > > > *From:* flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> [mailto:flexcoders@yahoogroups.com <mailto:flexcoders%40yahoogroups.com> ] *On > > Behalf Of *Daniel Freiman > > *Sent:* Friday, June 06, 2008 9:09 AM > > *To:* flexcoders > > *Subject:* [flexcoders] Math.abs() Limitation? > > > > > > > > According to my code the following statement returns true. > > > > Math.abs(int.MAX_VALUE - 1290) == Math.abs(int.MAX_VALUE - 1284) > > > > I tried converting everything to type Number that didn't help. Getting > > ride of the abs() makes the calculation work correctly but then I don't have > > the absolute value. > > > > Thoughts? > > > > - Daniel Freiman > > > > > > > > > > >