Java 为什么这个Szudzik优雅的配对给出了错误的结果?

Java 为什么这个Szudzik优雅的配对给出了错误的结果?,java,algorithm,function,math,equation,Java,Algorithm,Function,Math,Equation,我用优雅的配对将两个数字配对,形成一个唯一的数字。但当我在67108863上面配对两个相同的数字时,例如“配对(6710886467108864)”,它会给我4503599761588224。当我想解开它时,它会给我(-167108865)。然后我试着配对(-167108865),它也给了我4503599761588224。所有其他不同的数字在67108864下给出唯一的数字或相同的数字,除非我在67108863上对相同的数字,否则我可以对它们进行配对和取消配对;(671088646710886

我用优雅的配对将两个数字配对,形成一个唯一的数字。但当我在67108863上面配对两个相同的数字时,例如“配对(6710886467108864)”,它会给我4503599761588224。当我想解开它时,它会给我(-167108865)。然后我试着配对(-167108865),它也给了我4503599761588224。所有其他不同的数字在67108864下给出唯一的数字或相同的数字,除非我在67108863上对相同的数字,否则我可以对它们进行配对和取消配对;(6710886467108864),(507108864507108864)等

我的代码中是否有错误,或者我刚刚发现Szudzik优雅配对函数存在问题

/**
 *
 * @author HiltherJoe
 */
public class ElegantP {
    public static long pair(long x, long y) {
        return x >= y ? x * x + x + y : y * y + x;
    }
    public static long[] unpair(long z) {
        long b = (long) Math.sqrt(z);
        long a = z - b * b;
        return a < b ? new long[]{a, b} : new long[]{b, a - b};
    }
    public static void main(String[] args){
        int i = 67108864;
        long pairedNumber = pair(i, i);
        long[] unpair = unpair(pairedNumber);
        System.out.println("Paired Number is    " + pairedNumber);
        System.out.println("First unpaired Number is    " + unpair[0]+"    Second unpaired Number is    "+unpair[1]);
    }
}
/**
*
*@作者希尔瑟乔
*/
公共级雅致{
公共静态长对(长x、长y){
返回x>=y?x*x+x+y:y*y+x;
}
公共静态长[]取消配对(长z){
long b=(long)Math.sqrt(z);
长a=z-b*b;
返回a
此代码正在使用
Math.sqrt()
进行
双重计算-结果不够精确。对于
4503599761588224
对(6710886467108864)
),它将导致
67108865
而不是
67108864

使用
biginger.sqrt()

long b=biginger.valueOf(z.sqrt().longValue();
长a=z-b*b;

对于较大的数值,仍然存在溢出风险,因为SMA

此代码使用的是
Math.sqrt()
,它进行了
双重
计算-结果不够精确。对于
4503599761588224
对(6710886467108864)
),它将导致
67108865
而不是
67108864

使用
biginger.sqrt()

long b=biginger.valueOf(z.sqrt().longValue();
长a=z-b*b;

对于较大的数字,仍然存在由溢出引起的SMA溢出风险。“Long”有一个范围值,如果取一个值的平方,则会违反该范围值。@SMA我认为这不是溢出问题,因为较大的数字起作用并返回原始数字。尝试其他大于67108864的不同数字,您将看到您将获得这些数字。另外,为什么它适用于67108863而不适用于67108864?这是由于溢出。“Long”有一个范围值,如果取一个值的平方,则会违反该范围值。@SMA我认为这不是溢出问题,因为较大的数字起作用并返回原始数字。尝试其他大于67108864的不同数字,您将看到您将获得这些数字。还有,为什么它适用于67108863而不适用于67108864?对于溢出,这是正确的,对于较大的数字,我只使用大整数。对于溢出,这是正确的,对于较大的数字,我只使用大整数