Hmm .. rather than talking about doing "textual comparisons on numbers", why
not say "BigInt"( BigNum)?

There are lots of packages out there that already deal in infinite-precision
numbers, together with methods for converting them to and from strings, and
for doing arithmetic on them too, as well as doing comparisons. 

> -----Original Message-----
> From: Arnold, Curt [SMTP:[EMAIL PROTECTED]
> Sent: Thursday, January 06, 2000 9:27 PM
> To:   '[EMAIL PROTECTED]'
> Subject:      RE: PROPOSAL: Perform min/max validation of numeric types
> without con verting to numeric type
> 
> Say we are on a hypothetical platform where double's maximum value was
> 1E100 but the user either not interested in the value (just validation) or
> was bringing the textual representation into a
> symbolic math processor or into a MathML presentation document.
> 
> The schema author is unaware of this platform and writes a constraint like
> 
> <datatype type="someval" source="double">
>       <!--  for some physical reason the value can't exceed 1e200  -->
>       <maxInclusive value="1e200"/>
> </datatype>
> 
> If you did conversion on a platform that used IEEE double or used the
> approach that I described, then you would expect 0.9E200 to be legal and
> 1.1E200 to not be legal.
> 
> However, if you used conversion on a platform where double ranged was
> limited to 1E100, then there is no way have a different result for the
> range check for 0.9E200 and 1.1E200.  You either have to
> reject both or accept both.  
> 
> A text comparision would avoid rounding issues.  For example, if the
> schema author indicated that there was a minExclusive limit of 1.0, a text
> comparison would allow
> 1.00000000000000000000000000000000000000001 where conversion to a double
> would have lost that trailing 1 and indicated that the value violated that
> range.
> 
> Avoiding use of the C RTL floating point facility should be a major plus.
> It appears that Xerces-C on VC 6 is currently built to suppress
> initialization of C RTL floating point since I have not been
> able to coerce any of the text to double routines to work properly.
> 
> Definitely if we were needing to do any other floating point operations,
> then conversion to a numeric type would be necessary.  However, for
> validation, all that is necessary is comparision and that
> should be fairly simple to write robustly.
> 
> 
> 
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> Sent: Thursday, January 06, 2000 12:40 PM
> To: [EMAIL PROTECTED]
> Subject: Re: PROPOSAL: Perform min/max validation of numeric types
> without con verting to numeric type
> 
> 
> 
> 
> 
> I understand your objectives here; but, looking further down the road,
> there might be complicated issues. One of the big advantages of Schema is
> that the client program can know that say an attribute is an integer value
> between -31.38913 and +34.1233. In many instances, they are going to use
> this knowledge to convert that number to a binary themselves. If that
> result does not agree with the result gained via the lexical comparison,
> things could get wierd, right? So the lexical comparison of any text
> encoded binary values would have to absolutely match the results that
> would
> occur when the value is actually converted, or you might get conflicting
> results.
> 
> So I guess a question is whether it is more important to be consistent on
> a
> particular platform or not. If it is, then doing the conversion, warts and
> all, would insure that consistent results are gained. By the time you
> write
> the code to insure that you've handled all the platform specific rounding
> issues in the lexical comparison, might you not have come back to the same
> place you were attempting to avoid, just with more work?
> 
> For integral or cardinal values of course this is not such a big deal and
> a
> lexical comparison would work. But if Schema ever allowed a statement like
> (10 / 3) as a value in a range check, then similar issues would come up
> again.
> 
> I don't know that any of will really be a big deal in the end. I'm just
> playing Devil's Advocate so people will consider all the wierd angles.
> 
> ----------------------------------------
> Dean Roddey
> Software Weenie
> IBM Center for Java Technology - Silicon Valley
> [EMAIL PROTECTED]
> 
> 
> 
> "Arnold, Curt" <[EMAIL PROTECTED]> on 01/06/2000 09:26:38 AM
> 
> Please respond to [EMAIL PROTECTED]
> 
> To:   "'[EMAIL PROTECTED]'" <[EMAIL PROTECTED]>
> cc:
> Subject:  PROPOSAL: Perform min/max validation of numeric types without
> con
>       verting to numeric type
> 
> 
> 
> I would recommend that when someone starts working on implementing min/max
> validation of integers and reals that we attempt to implement the
> comparision operation without converting the string into a
> primitive numeric type.  This would avoid problems with the C RTL has not
> been initialized and avoid different validation behavior on different
> machines.  I also believe that it may be faster than
> conversion to a numeric type and a numeric comparision.  I think something
> like the following would be effective (unchecked C++ code).  If this type
> of approach was successful, the XML Schema could be
> greatly simplified by removing all the details of the implementation of
> IEEE 754 from Schema and leave the binding to a specific implementation
> type to the type-aware DOM initiative.
> 
> //
> //   the same class could be used for both real and integer types
> //
> class ValidationNumeric
> {
> public:
>      //
>      //   string is assumed to stay valid for lifetime of this object?
>      ValidationNumeric(const XMLCh* string);
>      inline long getExponent() const { return m_exponent; }
>      bool getIsPositive() const { return m_isPositive; }
>      bool getIsNaN() const { return m_isNaN; }
>      bool getIsInfinity() const { return m_isInfinity; }
>      const XMLCh* getMostSignificantDigit() const { return
> m_mostSignificantDigit; }
> 
>      enum compareResult { isEqual, isLess, isGreater, isInvalid };
> 
>      compareResult compare(const ValidationNumeric& other)
>           //
>           //   first shot, logic might not quite be right
>           if(getIsNaN() || other.getIsNaN())
>           {
>                if(getIsNaN() && other.getIsNaN()) return isEqual;
>                return isInvalid;
>           }
>           if(getIsPositive())
>           {
>                if(!other.getIsPositive()) return isLess;
>                if(other.isInfinity())
>                {
>                     if(isInfinity())
>                          return isEqual;
>                     else
>                          return isGreater;
>                }
>                if(getExponent() > other.getExponent()) return isLess;
>                if(getExponent() < other.getExponent()) return isGreater;
>                //
>                //    walk through both strings starting with most
> significant digit (skipping over .'s)
> 
>           }
>           ...
>      }
> 
>      bool operator>=(const ValidationNumeric& other)
>      {
>           compareResult result = compare(other);
>           if(result == isEqual || result == isGreater) return true;
>           return false;
>      }
> 
> private:
>      const XMLCh* m_mostSignificantDigit;
>      bool m_isPositive;
>      bool m_isNaN;
>      bool m_isInfinity;
>      long m_exponent;
> };
> 
> 
> 

Reply via email to