.
4 (), 8 1- , 16 , ( a double 52 + 1 ).
[0,5,1 [ ( , frexp), [64,256] [ 2.
mantissa *= 2^K
exponent -= K
mantissa*2^exponent. K 7 8. , . 4 , . r*2^(exponent/2), ldexp.
. ++ , . OP sr1 2,78 2 ^ 24 ; sr2 1.42s, sqrt 0,12 .
#include <math.h>
#include <stdio.h>
double sr1(double x)
{
double last = 0;
double r = x * 0.5;
int maxIters = 100;
for (int i = 0; i < maxIters; i++) {
r = (r + x / r) / 2;
if ( fabs(r - last) < 1.0e-10 )
break;
last = r;
}
return r;
}
double sr2(double x)
{
static const int ROOTS256[] = {
0,1,1,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,
11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,
12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16 };
int exponent;
double mantissa = frexp(x,&exponent);
if (mantissa == 0) return 0;
if (exponent & 1) { mantissa *= 128; exponent -= 7; }
else { mantissa *= 256; exponent -= 8; }
double root = ROOTS256[(int)floor(mantissa)];
for (int it=0;it<4;it++)
{
root = 0.5 * (root + mantissa / root);
}
return ldexp(root,exponent>>1);
}
int main()
{
double s = 0;
int mx = 1<<24;
for (int i=0;i<mx;i++) s += sr2(i);
}