/*
* Copyright ( C ) 2014 The Android Open Source Project
*
* Licensed under the Apache License , Version 2 . 0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
// Note that $opt$ is a marker for the optimizing compiler to test
// it does compile the method.
public class DivTest {
public static void expectEquals(int expected, int result) {
if (expected != result) {
throw new Error("Expected: " + expected + ", found: " + result);
}
}
public static void expectEquals(long expected, long result) {
if (expected != result) {
throw new Error("Expected: " + expected + ", found: " + result);
}
}
public static void expectEquals(float expected, float result) {
if (expected != result) {
throw new Error("Expected: " + expected + ", found: " + result);
}
}
public static void expectEquals(double expected, double result) {
if (expected != result) {
throw new Error("Expected: " + expected + ", found: " + result);
}
}
public static void expectApproxEquals(float a, float b) {
float maxDelta = 0 .00001 F;
boolean aproxEquals = (a > b) ? ((a - b) < maxDelta) : ((b - a) < maxDelta);
if (!aproxEquals) {
throw new Error("Expected: " + a + ", found: " + b
+ ", with delta: " + maxDelta + " " + (a - b));
}
}
public static void expectApproxEquals(double a, double b) {
double maxDelta = 0 .00001 D;
boolean aproxEquals = (a > b) ? ((a - b) < maxDelta) : ((b - a) < maxDelta);
if (!aproxEquals) {
throw new Error("Expected: " + a + ", found: "
+ b + ", with delta: " + maxDelta + " " + (a - b));
}
}
public static void expectNaN(float a) {
if (a == a) {
throw new Error("Expected NaN: " + a);
}
}
public static void expectNaN(double a) {
if (a == a) {
throw new Error("Expected NaN: " + a);
}
}
public static void expectDivisionByZero(int value) {
try {
$opt$Div(value, 0 );
throw new Error("Expected RuntimeException when dividing by 0" );
} catch (java.lang.RuntimeException e) {
}
try {
$opt$DivZero(value);
throw new Error("Expected RuntimeException when dividing by 0" );
} catch (java.lang.RuntimeException e) {
}
}
public static void expectDivisionByZero(long value) {
try {
$opt$Div(value, 0 L);
throw new Error("Expected RuntimeException when dividing by 0" );
} catch (java.lang.RuntimeException e) {
}
try {
$opt$DivZero(value);
throw new Error("Expected RuntimeException when dividing by 0" );
} catch (java.lang.RuntimeException e) {
}
}
public static void main() {
divInt();
divLong();
divFloat();
divDouble();
}
private static void divInt() {
expectEquals(2 , $opt$DivConst(6 ));
expectEquals(2 , $opt$Div(6 , 3 ));
expectEquals(6 , $opt$Div(6 , 1 ));
expectEquals(-2 , $opt$Div(6 , -3 ));
expectEquals(1 , $opt$Div(4 , 3 ));
expectEquals(-1 , $opt$Div(4 , -3 ));
expectEquals(5 , $opt$Div(23 , 4 ));
expectEquals(-5 , $opt$Div(-23 , 4 ));
expectEquals(-Integer.MAX_VALUE, $opt$Div(Integer.MAX_VALUE, -1 ));
expectEquals(Integer.MIN_VALUE, $opt$Div(Integer.MIN_VALUE, -1 )); // overflow
expectEquals(-1073741824 , $opt$Div(Integer.MIN_VALUE, 2 ));
expectEquals(0 , $opt$Div(0 , Integer.MAX_VALUE));
expectEquals(0 , $opt$Div(0 , Integer.MIN_VALUE));
expectDivisionByZero(0 );
expectDivisionByZero(1 );
expectDivisionByZero(Integer.MAX_VALUE);
expectDivisionByZero(Integer.MIN_VALUE);
}
private static void divLong() {
expectEquals(2 L, $opt$DivConst(6 L));
expectEquals(2 L, $opt$Div(6 L, 3 L));
expectEquals(6 L, $opt$Div(6 L, 1 L));
expectEquals(-2 L, $opt$Div(6 L, -3 L));
expectEquals(1 L, $opt$Div(4 L, 3 L));
expectEquals(-1 L, $opt$Div(4 L, -3 L));
expectEquals(5 L, $opt$Div(23 L, 4 L));
expectEquals(-5 L, $opt$Div(-23 L, 4 L));
expectEquals(-Integer.MAX_VALUE, $opt$Div(Integer.MAX_VALUE, -1 L));
expectEquals(2147483648 L, $opt$Div(Integer.MIN_VALUE, -1 L));
expectEquals(-1073741824 L, $opt$Div(Integer.MIN_VALUE, 2 L));
expectEquals(-Long .MAX_VALUE, $opt$Div(Long .MAX_VALUE, -1 L));
expectEquals(Long .MIN_VALUE, $opt$Div(Long .MIN_VALUE, -1 L)); // overflow
expectEquals(11111111111111 L, $opt$Div(33333333333333 L, 3 L));
expectEquals(3 L, $opt$Div(33333333333333 L, 11111111111111 L));
expectEquals(0 L, $opt$Div(0 L, Long .MAX_VALUE));
expectEquals(0 L, $opt$Div(0 L, Long .MIN_VALUE));
expectDivisionByZero(0 L);
expectDivisionByZero(1 L);
expectDivisionByZero(Long .MAX_VALUE);
expectDivisionByZero(Long .MIN_VALUE);
}
private static void divFloat() {
expectApproxEquals(1 .6666666 F, $opt$Div(5 F, 3 F));
expectApproxEquals(0 F, $opt$Div(0 F, 3 F));
expectApproxEquals(-0 .3333333 F, $opt$Div(1 F, -3 F));
expectApproxEquals(4 F, $opt$Div(-12 F, -3 F));
expectApproxEquals(0 .5 , $opt$Div(0 .1 F, 0 .2 F));
expectApproxEquals(-2 .5 F, $opt$Div(-0 .5 F, 0 .2 F));
expectEquals(0 F, $opt$Div(0 F, Float .POSITIVE_INFINITY));
expectEquals(0 F, $opt$Div(11 F, Float .POSITIVE_INFINITY));
expectEquals(0 F, $opt$Div(0 F, Float .NEGATIVE_INFINITY));
expectEquals(0 F, $opt$Div(11 F, Float .NEGATIVE_INFINITY));
expectNaN($opt$Div(0 F, 0 F));
expectNaN($opt$Div(Float .NaN, 11 F));
expectNaN($opt$Div(-11 F, Float .NaN));
expectNaN($opt$Div(Float .NEGATIVE_INFINITY, Float .NEGATIVE_INFINITY));
expectNaN($opt$Div(Float .NEGATIVE_INFINITY, Float .POSITIVE_INFINITY));
expectNaN($opt$Div(Float .POSITIVE_INFINITY, Float .NEGATIVE_INFINITY));
expectNaN($opt$Div(Float .POSITIVE_INFINITY, Float .POSITIVE_INFINITY));
expectNaN($opt$Div(Float .NaN, Float .NEGATIVE_INFINITY));
expectNaN($opt$Div(Float .POSITIVE_INFINITY, Float .NaN));
expectEquals(Float .POSITIVE_INFINITY, $opt$Div(3 F, 0 F));
expectEquals(Float .NEGATIVE_INFINITY, $opt$Div(-3 F, 0 F));
expectEquals(Float .POSITIVE_INFINITY, $opt$Div(Float .MAX_VALUE, Float .MIN_VALUE));
expectEquals(Float .NEGATIVE_INFINITY, $opt$Div(-Float .MAX_VALUE, Float .MIN_VALUE));
}
private static void divDouble() {
expectApproxEquals(1 .6666666 D, $opt$Div(5 D, 3 D));
expectApproxEquals(0 D, $opt$Div(0 D, 3 D));
expectApproxEquals(-0 .3333333 D, $opt$Div(1 D, -3 D));
expectApproxEquals(4 D, $opt$Div(-12 D, -3 D));
expectApproxEquals(0 .5 , $opt$Div(0 .1 D, 0 .2 D));
expectApproxEquals(-2 .5 D, $opt$Div(-0 .5 D, 0 .2 D));
expectEquals(0 D, $opt$Div(0 D, Float .POSITIVE_INFINITY));
expectEquals(0 D, $opt$Div(11 D, Float .POSITIVE_INFINITY));
expectEquals(0 D, $opt$Div(0 D, Float .NEGATIVE_INFINITY));
expectEquals(0 D, $opt$Div(11 D, Float .NEGATIVE_INFINITY));
expectNaN($opt$Div(0 D, 0 D));
expectNaN($opt$Div(Float .NaN, 11 D));
expectNaN($opt$Div(-11 D, Float .NaN));
expectNaN($opt$Div(Float .NEGATIVE_INFINITY, Float .NEGATIVE_INFINITY));
expectNaN($opt$Div(Float .NEGATIVE_INFINITY, Float .POSITIVE_INFINITY));
expectNaN($opt$Div(Float .POSITIVE_INFINITY, Float .NEGATIVE_INFINITY));
expectNaN($opt$Div(Float .POSITIVE_INFINITY, Float .POSITIVE_INFINITY));
expectNaN($opt$Div(Float .NaN, Float .NEGATIVE_INFINITY));
expectNaN($opt$Div(Float .POSITIVE_INFINITY, Float .NaN));
expectEquals(Float .POSITIVE_INFINITY, $opt$Div(3 D, 0 D));
expectEquals(Float .NEGATIVE_INFINITY, $opt$Div(-3 D, 0 D));
expectEquals(Float .POSITIVE_INFINITY, $opt$Div(Float .MAX_VALUE, Float .MIN_VALUE));
expectEquals(Float .NEGATIVE_INFINITY, $opt$Div(-Float .MAX_VALUE, Float .MIN_VALUE));
}
static int $opt$Div(int a, int b) {
return a / b;
}
static int $opt$DivZero(int a) {
return a / 0 ;
}
// Division by literals != 0 should not generate checks.
static int $opt$DivConst(int a) {
return a / 3 ;
}
static long $opt$DivConst(long a) {
return a / 3 L;
}
static long $opt$Div(long a, long b) {
return a / b;
}
static long $opt$DivZero(long a) {
return a / 0 L;
}
static float $opt$Div(float a, float b) {
return a / b;
}
static double $opt$Div(double a, double b) {
return a / b;
}
}
Messung V0.5 in Prozent C=78 H=94 G=86
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-29)
¤
*© Formatika GbR, Deutschland