Java-정수 기반
이 프로그램은 pi를 사용하지 않으며 sqrt도 아닌 외부 함수를 호출하지 않습니다. 그것은 단순한 산술을 사용 - +
, -
, *
와 /
. 또한 스케일링 단계 외에 정수로만 작동합니다. 기본적으로 구를 작은 큐브로 나누고 상자 외부에있는 큐브를 계산합니다.
public class Box {
private static final int MIN = 10000;
private static final int MAX = MIN * 2;
private static final int[] SQ = new int[MAX * MAX + 1];
static {
int t = 1;
for (int i = 1; i <= MAX; ++i) {
while (t < i * i) SQ[t++] = i - 1;
}
SQ[MAX * MAX] = MAX;
}
public static long outsideInt(int r, int w, int z) {
int r2 = r * r;
int o = z - r + 1;
if (w < r * 2) {
int t = 1 - SQ[r2 - w * w / 4];
if (t < o) o = t;
}
long v = 0;
for (int i = o; i <= r; ++i) {
int d = r2 - i * i;
int j0 = SQ[d];
v += 1 + 3 * j0;
for (int j = 1; j <= j0; ++j)
v += 4 * SQ[d - j * j];
}
return v;
}
public static double outside(double x, double y, double z, double d) {
double f = 1;
double w = x < y ? x : y;
double r = d / 2;
while (r < MIN) {
f *= 8;
r *= 2;
w *= 2;
z *= 2;
}
while (r > MAX) {
f /= 8;
r /= 2;
w /= 2;
z /= 2;
}
return outsideInt((int) r, (int) w, (int) z) / f;
}
public static void main(final String... args) {
System.out.println(outside(1, 1, 1, 1));
System.out.println(outside(1, 1, 0, 1));
System.out.println(outside(1, 1, 0.5, 1));
System.out.println(outside(1, 0.999, 1, 1));
System.out.println(outside(0.1, 1, 1, 0.5));
}
}
산출:
0.0
0.5235867850933005
0.26178140856157484
0.27938608275528054
0.06542839088004015
이 형식에서 프로그램은 2GB 이상의 메모리가 필요하며 ( -Xmx2300m
여기에서 작동 ) 매우 느립니다. 메모리를 사용하여 제곱근을 미리 계산합니다 (산술적으로). 실제로 필요하지는 않지만 그렇지 않으면 많이 느려집니다. 메모리 요구와 속도를 모두 향상 시키려면 MIN
상수 값을 줄이십시오 (정확도는 떨어집니다).