/*
* 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 MulTest {
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) {
boolean aproxEquals = (a > b)
? ((a - b) < maxDelta)
: ((b - a) < maxDelta);
if (!aproxEquals) {
throw new Error("Expected: " + a + ", found: " + b + ", with delta: " + maxDelta);
}
}
public static void expectApproxEquals(double a, double b, double maxDelta) {
boolean aproxEquals = (a > b)
? ((a - b) < maxDelta)
: ((b - a) < maxDelta);
if (!aproxEquals) {
throw new Error("Expected: " + a + ", found: " + b + ", with delta: " + maxDelta);
}
}
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 main() {
mulInt();
mulLong();
mulFloat();
mulDouble();
}
private static void mulInt() {
expectEquals(15 , $opt$Mul(5 , 3 ));
expectEquals(0 , $opt$Mul(0 , 0 ));
expectEquals(0 , $opt$Mul(0 , 3 ));
expectEquals(0 , $opt$Mul(3 , 0 ));
expectEquals(-3 , $opt$Mul(1 , -3 ));
expectEquals(36 , $opt$Mul(-12 , -3 ));
expectEquals(33 , $opt$Mul(1 , 3 ) * 11 );
expectEquals(671088645 , $opt$Mul(134217729 , 5 )); // (2^27 + 1) * 5
}
private static void mulLong() {
expectEquals(15 L, $opt$Mul(5 L, 3 L));
expectEquals(0 L, $opt$Mul(0 L, 0 L));
expectEquals(0 L, $opt$Mul(0 L, 3 L));
expectEquals(0 L, $opt$Mul(3 L, 0 L));
expectEquals(-3 L, $opt$Mul(1 L, -3 L));
expectEquals(36 L, $opt$Mul(-12 L, -3 L));
expectEquals(33 L, $opt$Mul(1 L, 3 L) * 11 L);
expectEquals(240518168583 L, $opt$Mul(34359738369 L, 7 L)); // (2^35 + 1) * 7
}
private static void mulFloat() {
expectApproxEquals(15 F, $opt$Mul(5 F, 3 F), 0 .0001 F);
expectApproxEquals(0 F, $opt$Mul(0 F, 0 F), 0 .0001 F);
expectApproxEquals(0 F, $opt$Mul(0 F, 3 F), 0 .0001 F);
expectApproxEquals(0 F, $opt$Mul(3 F, 0 F), 0 .0001 F);
expectApproxEquals(-3 F, $opt$Mul(1 F, -3 F), 0 .0001 F);
expectApproxEquals(36 F, $opt$Mul(-12 F, -3 F), 0 .0001 F);
expectApproxEquals(33 F, $opt$Mul(1 F, 3 F) * 11 F, 0 .0001 F);
expectApproxEquals(0 .02 F, 0 .1 F * 0 .2 F, 0 .0001 F);
expectApproxEquals(-0 .1 F, -0 .5 F * 0 .2 F, 0 .0001 F);
expectNaN($opt$Mul(0 F, Float .POSITIVE_INFINITY));
expectNaN($opt$Mul(0 F, Float .NEGATIVE_INFINITY));
expectNaN($opt$Mul(Float .NaN, 11 F));
expectNaN($opt$Mul(Float .NaN, -11 F));
expectNaN($opt$Mul(Float .NaN, Float .NEGATIVE_INFINITY));
expectNaN($opt$Mul(Float .NaN, Float .POSITIVE_INFINITY));
expectEquals(Float .POSITIVE_INFINITY, $opt$Mul(2 F, 3 .40282346638528860 e+38 F));
expectEquals(Float .POSITIVE_INFINITY, $opt$Mul(2 F, Float .POSITIVE_INFINITY));
expectEquals(Float .NEGATIVE_INFINITY, $opt$Mul(-2 F, Float .POSITIVE_INFINITY));
expectEquals(Float .NEGATIVE_INFINITY, $opt$Mul(-2 F, 3 .40282346638528860 e+38 F));
expectEquals(Float .NEGATIVE_INFINITY, $opt$Mul(2 F, Float .NEGATIVE_INFINITY));
expectEquals(Float .POSITIVE_INFINITY, $opt$Mul(-2 F, Float .NEGATIVE_INFINITY));
expectEquals(Float .NEGATIVE_INFINITY,
$opt$Mul(Float .POSITIVE_INFINITY, Float .NEGATIVE_INFINITY));
expectEquals(Float .POSITIVE_INFINITY,
$opt$Mul(Float .POSITIVE_INFINITY, Float .POSITIVE_INFINITY));
expectEquals(Float .POSITIVE_INFINITY,
$opt$Mul(Float .NEGATIVE_INFINITY, Float .NEGATIVE_INFINITY));
}
private static void mulDouble() {
expectApproxEquals(15 D, $opt$Mul(5 D, 3 D), 0 .0001 D);
expectApproxEquals(0 D, $opt$Mul(0 D, 0 D), 0 .0001 D);
expectApproxEquals(0 D, $opt$Mul(0 D, 3 D), 0 .0001 D);
expectApproxEquals(0 D, $opt$Mul(3 D, 0 D), 0 .0001 D);
expectApproxEquals(-3 D, $opt$Mul(1 D, -3 D), 0 .0001 D);
expectApproxEquals(36 D, $opt$Mul(-12 D, -3 D), 0 .0001 D);
expectApproxEquals(33 D, $opt$Mul(1 D, 3 D) * 11 D, 0 .0001 D);
expectApproxEquals(0 .02 D, 0 .1 D * 0 .2 D, 0 .0001 D);
expectApproxEquals(-0 .1 D, -0 .5 D * 0 .2 D, 0 .0001 D);
expectNaN($opt$Mul(0 D, Double .POSITIVE_INFINITY));
expectNaN($opt$Mul(0 D, Double .NEGATIVE_INFINITY));
expectNaN($opt$Mul(Double .NaN, 11 D));
expectNaN($opt$Mul(Double .NaN, -11 D));
expectNaN($opt$Mul(Double .NaN, Double .NEGATIVE_INFINITY));
expectNaN($opt$Mul(Double .NaN, Double .POSITIVE_INFINITY));
expectEquals(Double .POSITIVE_INFINITY, $opt$Mul(2 D, 1 .79769313486231570 e+308 ));
expectEquals(Double .POSITIVE_INFINITY, $opt$Mul(2 D, Double .POSITIVE_INFINITY));
expectEquals(Double .NEGATIVE_INFINITY, $opt$Mul(-2 D, Double .POSITIVE_INFINITY));
expectEquals(Double .NEGATIVE_INFINITY, $opt$Mul(-2 D, 1 .79769313486231570 e+308 ));
expectEquals(Double .NEGATIVE_INFINITY, $opt$Mul(2 D, Double .NEGATIVE_INFINITY));
expectEquals(Double .POSITIVE_INFINITY, $opt$Mul(-2 D, Double .NEGATIVE_INFINITY));
expectEquals(Double .NEGATIVE_INFINITY, $opt$Mul(Double .POSITIVE_INFINITY, Double .NEGATIVE_INFINITY));
expectEquals(Double .POSITIVE_INFINITY, $opt$Mul(Double .POSITIVE_INFINITY, Double .POSITIVE_INFINITY));
expectEquals(Double .POSITIVE_INFINITY, $opt$Mul(Double .NEGATIVE_INFINITY, Double .NEGATIVE_INFINITY));
}
static int $opt$Mul(int a, int b) {
return a * b;
}
static long $opt$Mul(long a, long b) {
return a * b;
}
static float $opt$Mul(float a, float b) {
return a * b;
}
static double $opt$Mul(double a, double b) {
return a * b;
}
}
Messung V0.5 in Prozent C=77 H=94 G=85
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-29)
¤
*© Formatika GbR, Deutschland