Javaでunsignedint変換を実行しているときに、いくつかの「異常な」結果が得られました。これは、以下に示す最小限のケースに切り詰めました。Cの同じコードは、同様の結果を生成します。
問題は、ガウス和の式n(n + 1)/ 2( https://en.wikipedia.org/wiki/Summationを参照)を使用してすべての整数値の絶対値の理論上の合計を計算すると、値Iが実際にすべての絶対値を1つずつ合計すると、calculateは合計と一致しません。
合計式を使用して合計を計算する場合、絶対値として負の数と正の数の両方を追加するため、2 "/ 2"による除算は省略され、最後に(longIntegerMax + 1)を追加する必要があることに注意してください。負の数には、最後に1つの余分な数値(Integer.MIN)があり、絶対値はInteger.MAX+1です。
public static void main( String[] asArguments ){
long longAbsoluteTotal = 0;
long longNumberOfIntegers = 0;
long longIntegerMax = Integer.MAX_VALUE;
long longIntegerMin = Integer.MIN_VALUE;
for( int i = Integer.MIN_VALUE;; i++ ){
longNumberOfIntegers++;
if( i < 0 ){
longAbsoluteTotal += i * -1;
} else {
longAbsoluteTotal += i;
}
if( i == Integer.MAX_VALUE ) break;
}
long longCalculatedTotal = longIntegerMax * (longIntegerMax + 1) + longIntegerMax + 1;
System.out.println( "count of all integers: " + longNumberOfIntegers );
System.out.println( "total of absolute value of all integers: " + longAbsoluteTotal );
System.out.println( "calculated total of absolute value of all integers: " + longCalculatedTotal );
}
出力:
count of all integers: 4294967296
total of absolute value of all integers: 4611686014132420608
calculated total of absolute value of all integers: 4611686018427387904
ご覧のとおり、計算された合計は実際の合計に近いですが、正確には一致していません。なぜだめですか?