Allow for specific atan2 and toRadians off-by-one errors

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1063032 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Sebastian Bazley 2011-01-24 22:26:31 +00:00
parent 7b09face70
commit 1659159855
1 changed files with 23 additions and 17 deletions

View File

@ -60,29 +60,29 @@ public class FastMathStrictComparisonTest {
Float.MIN_VALUE, Float.MAX_VALUE, // 6,7 Float.MIN_VALUE, Float.MAX_VALUE, // 6,7
-Float.MIN_VALUE, -Float.MAX_VALUE, // 8,9 -Float.MIN_VALUE, -Float.MAX_VALUE, // 8,9
}; };
private static final Object [] LONG_SPECIAL_VALUES = { private static final Object [] LONG_SPECIAL_VALUES = {
-1,0,1, // 1,2,3 -1,0,1, // 1,2,3
Long.MIN_VALUE, Long.MAX_VALUE, // 4,5 Long.MIN_VALUE, Long.MAX_VALUE, // 4,5
}; };
private static final Object[] INT_SPECIAL_VALUES = { private static final Object[] INT_SPECIAL_VALUES = {
-1,0,1, // 1,2,3 -1,0,1, // 1,2,3
Integer.MIN_VALUE, Integer.MAX_VALUE, // 4,5 Integer.MIN_VALUE, Integer.MAX_VALUE, // 4,5
}; };
private final Method mathMethod; private final Method mathMethod;
private final Method fastMethod; private final Method fastMethod;
private final Type[] types; private final Type[] types;
private final Object[][] valueArrays; private final Object[][] valueArrays;
public FastMathStrictComparisonTest(Method m, Method f, Type[] types, Object[][] data) throws Exception{ public FastMathStrictComparisonTest(Method m, Method f, Type[] types, Object[][] data) throws Exception{
this.mathMethod=m; this.mathMethod=m;
this.fastMethod=f; this.fastMethod=f;
this.types=types; this.types=types;
this.valueArrays=data; this.valueArrays=data;
} }
@Test @Test
public void test1() throws Exception{ public void test1() throws Exception{
setupMethodCall(mathMethod, fastMethod, types, valueArrays); setupMethodCall(mathMethod, fastMethod, types, valueArrays);
@ -96,21 +96,28 @@ public class FastMathStrictComparisonTest {
} }
private static void reportFailedResults(Method mathMethod, Object[] params, Object expected, Object actual, int[] entries){ private static void reportFailedResults(Method mathMethod, Object[] params, Object expected, Object actual, int[] entries){
final String methodName = mathMethod.getName();
String format = null; String format = null;
long actL=0; long actL=0;
long expL=0; long expL=0;
if (expected instanceof Double) { if (expected instanceof Double) {
Double exp = (Double) expected; Double exp = (Double) expected;
Double act = (Double) actual; Double act = (Double) actual;
if (isNumber(exp) && isNumber(act)) { // show difference as hex if (isNumber(exp) && isNumber(act) && exp != 0) { // show difference as hex
actL = Double.doubleToLongBits(act); actL = Double.doubleToLongBits(act);
expL = Double.doubleToLongBits(exp); expL = Double.doubleToLongBits(exp);
if (Math.abs(actL-expL)==1) {
// Not 100% sure off-by-one errors are allowed everywhere, so only allow for these methods
if (methodName.equals("toRadians") || methodName.equals("atan2")) {
return;
}
}
format = "%016x"; format = "%016x";
} }
} else if (expected instanceof Float ){ } else if (expected instanceof Float ){
Float exp = (Float) expected; Float exp = (Float) expected;
Float act = (Float) actual; Float act = (Float) actual;
if (isNumber(exp) && isNumber(act)) { // show difference as hex if (isNumber(exp) && isNumber(act) && exp != 0) { // show difference as hex
actL = Float.floatToIntBits(act); actL = Float.floatToIntBits(act);
expL = Float.floatToIntBits(exp); expL = Float.floatToIntBits(exp);
format = "%08x"; format = "%08x";
@ -119,7 +126,7 @@ public class FastMathStrictComparisonTest {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append(mathMethod.getReturnType().getSimpleName()); sb.append(mathMethod.getReturnType().getSimpleName());
sb.append(" "); sb.append(" ");
sb.append(mathMethod.getName()); sb.append(methodName);
sb.append("("); sb.append("(");
String sep = ""; String sep = "";
for(Object o : params){ for(Object o : params){
@ -129,13 +136,13 @@ public class FastMathStrictComparisonTest {
} }
sb.append(") expected "); sb.append(") expected ");
if (format != null){ if (format != null){
sb.append(String.format(format, expL)); sb.append(String.format(format, expL));
} else { } else {
sb.append(expected); sb.append(expected);
} }
sb.append(" actual "); sb.append(" actual ");
if (format != null){ if (format != null){
sb.append(String.format(format, actL)); sb.append(String.format(format, actL));
} else { } else {
sb.append(actual); sb.append(actual);
} }
@ -148,7 +155,7 @@ public class FastMathStrictComparisonTest {
} else { } else {
System.out.println(message); System.out.println(message);
} }
} }
private static void callMethods(Method mathMethod, Method fastMethod, private static void callMethods(Method mathMethod, Method fastMethod,
Object[] params, int[] entries) throws IllegalAccessException, Object[] params, int[] entries) throws IllegalAccessException,
@ -163,8 +170,8 @@ public class FastMathStrictComparisonTest {
Assert.fail(mathMethod+" "+e); Assert.fail(mathMethod+" "+e);
} }
} }
private static void setupMethodCall(Method mathMethod, Method fastMethod, private static void setupMethodCall(Method mathMethod, Method fastMethod,
Type[] types, Object[][] valueArrays) throws Exception { Type[] types, Object[][] valueArrays) throws Exception {
Object[] params = new Object[types.length]; Object[] params = new Object[types.length];
int entry1 = 0; int entry1 = 0;
@ -177,9 +184,9 @@ public class FastMathStrictComparisonTest {
int entry2 = 0; int entry2 = 0;
for(Object d1 : valueArrays[1]) { for(Object d1 : valueArrays[1]) {
entry2++; entry2++;
params[1] = d1; params[1] = d1;
entries[1] = entry2; entries[1] = entry2;
callMethods(mathMethod, fastMethod, params, entries); callMethods(mathMethod, fastMethod, params, entries);
} }
} else { } else {
callMethods(mathMethod, fastMethod, params, entries); callMethods(mathMethod, fastMethod, params, entries);
@ -228,7 +235,7 @@ public class FastMathStrictComparisonTest {
list.add(new Object[]{mathMethod, fastMethod, types, values}); list.add(new Object[]{mathMethod, fastMethod, types, values});
// setupMethodCall(mathMethod, fastMethod, params, data); // setupMethodCall(mathMethod, fastMethod, params, data);
} else { } else {
System.out.println("Cannot find public FastMath method corresponding to: "+mathMethod); System.out.println("Cannot find public FastMath method corresponding to: "+mathMethod);
} }
} catch (NoSuchMethodException e) { } catch (NoSuchMethodException e) {
System.out.println("Cannot find FastMath method corresponding to: "+mathMethod); System.out.println("Cannot find FastMath method corresponding to: "+mathMethod);
@ -238,5 +245,4 @@ public class FastMathStrictComparisonTest {
} }
return list; return list;
} }
} }