Hi Brian,

It would be nice to avoid the caches, on a hunch i am wondering if the 
following will work:

  long result = first * radix + second;
  if ((first >>> 1) > (Long.MAX_VALUE / radix) ||  // possible overflow of 
first * radix
    Long.compareUnsigned(result, first) < 0) {  // overflow of  first * radix + 
second

It should be possible to write some tests creating strings in the appropriate 
base to select the appropriate value for first will kick off an overflow.

Paul.
 
On Dec 19, 2013, at 9:21 PM, Brian Burkhalter <brian.burkhal...@oracle.com> 
wrote:

> Here's a formalization of the suggested fix:
> 
> http://cr.openjdk.java.net/~bpb/8030814/webrev/
> 
> It works against the test case.
> 
> Brian
> 
> On Dec 19, 2013, at 11:26 AM, Brian Burkhalter wrote:
> 
>> Upon inspection only that indeed looks correct.
>> 
>> Thanks …
>> 
>> On Dec 19, 2013, at 10:28 AM, Louis Wasserman wrote:
>> 
>>> Here's one approach that works: there is overflow iff 
>>> 
>>> compareUnsigned(first, divideUnsigned(MAX_UNSIGNED, radix)) > 0 || (first 
>>> == divideUnsigned(MAX_UNSIGNED, radix) && second > 
>>> remainderUnsigned(MAX_UNSIGNED, radix));
>>> 
>>> Since radix <= Character.MAX_RADIX, you can precompute the divides and 
>>> remainders in a small table.
>> 
> 

Reply via email to