package org.dyndns.jkiddo.raop.server.AirReceiver;
import org.dyndns.jkiddo.raop.server.audio.Functions;
import org.dyndns.jkiddo.raop.server.audio.Taylor;
import org.junit.Assert;
import org.junit.Test;
public class TestFunctions {
public float resultFloat;
public double resultDouble;
@Test
public void testSincDouble() {
double x = Double.MIN_VALUE;
Assert.assertEquals(Functions.sinc(x), 1.0, 0.0);
while (x < 1.0) {
Assert.assertEquals("x=" + x, Taylor.sinc(x), Functions.sinc(x), 1e-15);
x = x * 1.1 + Math.ulp(x);
}
}
@Test
public void testSincFloat() {
float x = Float.MIN_VALUE;
Assert.assertEquals(Functions.sinc(x), 1.0f, 0.0);
while (x < 1.0f) {
Assert.assertEquals("x=" + x, (float)Taylor.sinc(x), Functions.sinc(x), 1e-7f);
x = x * 1.1f + Math.ulp(x);
}
}
private static final int TestSincPerformanceN = 100000;
@Test
public void testSincFloatPerformance() {
double sincOverhead = Float.POSITIVE_INFINITY;
double sincWithOverhead = Float.POSITIVE_INFINITY;
for(int n=0; n < 10; ++n) {
resultDouble = 0;
long startNanos = System.nanoTime();
for(int i=2; i <= (TestSincPerformanceN + 1); ++i) {
resultFloat += 1.0f / i;
}
long overheadNanos = System.nanoTime();
for(int i=2; i <= (TestSincPerformanceN + 1); ++i) {
resultFloat += Functions.sinc(1.0f / i);
}
long endNanos = System.nanoTime();
sincOverhead = Math.min(sincOverhead, 1e-9 * (overheadNanos - startNanos) / TestSincPerformanceN);
sincWithOverhead = Math.min(sincWithOverhead, 1e-9 * (endNanos - overheadNanos) / TestSincPerformanceN);
}
System.out.println("sinc(float x) takes " + (sincWithOverhead - sincOverhead) + " seconds (accounted for overhead of " + sincOverhead + " seconds)");
}
@Test
public void testSincDoublePerformance() {
double sincOverhead = Float.POSITIVE_INFINITY;
double sincWithOverhead = Float.POSITIVE_INFINITY;
for(int n=0; n < 10; ++n) {
resultDouble = 0;
long startNanos = System.nanoTime();
for(int i=2; i <= (TestSincPerformanceN + 1); ++i) {
resultDouble += 1.0 / i;
}
long overheadNanos = System.nanoTime();
for(int i=2; i <= (TestSincPerformanceN + 1); ++i) {
resultDouble += Functions.sinc(1.0 / i);
}
long endNanos = System.nanoTime();
sincOverhead = Math.min(sincOverhead, 1e-9 * (overheadNanos - startNanos) / TestSincPerformanceN);
sincWithOverhead = Math.min(sincWithOverhead, 1e-9 * (endNanos - overheadNanos) / TestSincPerformanceN);
}
System.out.println("sinc(double x) takes " + (sincWithOverhead - sincOverhead) + " seconds (accounted for overhead of " + sincOverhead + " seconds)");
}
}