/* return t such that e(t) > sqrt(N), set *faet = odd prime divisors of e(t) */ static ulong compute_t(GEN N, GEN *e, GEN *faet) { /* 2^e b <= N < 2^e (b+1), where b >= 2^52. Approximating log_2 N by * log2(gtodouble(N)) ~ e+log2(b), the error is less than log(1+1/b) < 1e-15*/ double C = dbllog2(N) + 1e-6; /* > log_2 N */ ulong t; GEN B; /* Return "smallest" t such that f(t) >= C, which implies e(t) > sqrt(N) */ /* For N < 2^3515 ~ 10^1058 */ if (C < 3514.6) { t = compute_t_small(C); *e = compute_e(t, faet); return t; } B = sqrti(N); for (t = 8648640+840;; t+=840) { pari_sp av = avma; *e = compute_e(t, faet); if (cmpii(*e, B) > 0) break; avma = av; } return t; }
/* * Счётные задачи в бесконечном цикле вычисляют некоторое значение и * сравнивают его с эталоном. Подсчитывается количество циклов и * количество ошибок. */ void test_fpu1 (void *arg) { task_fpu_control (task_current, FCSR_ROUND_N, FCSR_ROUND | FCSR_ENABLES); for (;;) { /* Вычисляем E - основание натурального логарифма. */ e = compute_e (1); count_e_loops++; if (e != 0x2.b7e151628aed2p0) count_e_errors++; } }