void testValues() { f = 2; double result; double x,y; hypotl(anylongdouble(), anylongdouble()); //x = anylongdouble(); //y = anylongdouble(); //result = hypotl(x,y); // assert result == \sqrt(\pow(x,2)+\pow(y,2)); //@ assert f == 2; //@ assert vacuous: \false; }
long double complex CLANG_PORT_DECL(csqrtl) (long double complex Z) { long double complex Res; long double r; long double x = __real__ Z; long double y = __imag__ Z; if (y == 0.0L) { if (x < 0.0L) { __real__ Res = 0.0L; __imag__ Res = sqrtl (-x); } else { __real__ Res = sqrtl (x); __imag__ Res = 0.0L; } } else if (x == 0.0L) { r = sqrtl(0.5L * fabsl (y)); __real__ Res = r; __imag__ Res = y > 0 ? r : -r; } else { long double t = sqrtl (2.0L * (hypotl (__real__ Z, __imag__ Z) + fabsl (x))); long double u = t / 2.0L; if ( x > 0.0L) { __real__ Res = u; __imag__ Res = y / t; } else { __real__ Res = fabsl (y / t); __imag__ Res = y < 0 ? -u : u; } } return Res; }
long double cabsl (long double complex z) { return hypotl (REALPART (z), IMAGPART (z)); }
long double cabsl(ldcomplex z) { return (hypotl(LD_RE(z), LD_IM(z))); }
long double ft_complex_abs(const t_complex *z) { return (hypotl(z->re, z->im)); }
long double cabsl(long double complex z) { return hypotl(creall(z), cimagl(z)); }
static int testl(long double long_double_x, int int_x, long long_x) { int r = 0; r += __finitel(long_double_x); r += __fpclassifyl(long_double_x); r += __isinfl(long_double_x); r += __isnanl(long_double_x); r += __signbitl(long_double_x); r += acoshl(long_double_x); r += acosl(long_double_x); r += asinhl(long_double_x); r += asinl(long_double_x); r += atan2l(long_double_x, long_double_x); r += atanhl(long_double_x); r += atanl(long_double_x); r += cbrtl(long_double_x); r += ceill(long_double_x); r += copysignl(long_double_x, long_double_x); r += coshl(long_double_x); r += cosl(long_double_x); r += erfcl(long_double_x); r += erfl(long_double_x); r += exp2l(long_double_x); r += expl(long_double_x); r += expm1l(long_double_x); r += fabsl(long_double_x); r += fdiml(long_double_x, long_double_x); r += floorl(long_double_x); r += fmal(long_double_x, long_double_x, long_double_x); r += fmaxl(long_double_x, long_double_x); r += fminl(long_double_x, long_double_x); r += fmodl(long_double_x, long_double_x); r += frexpl(long_double_x, &int_x); r += hypotl(long_double_x, long_double_x); r += ilogbl(long_double_x); r += ldexpl(long_double_x, int_x); r += lgammal(long_double_x); r += llrintl(long_double_x); r += llroundl(long_double_x); r += log10l(long_double_x); r += log1pl(long_double_x); r += log2l(long_double_x); r += logbl(long_double_x); r += logl(long_double_x); r += lrintl(long_double_x); r += lroundl(long_double_x); r += modfl(long_double_x, &long_double_x); r += nearbyintl(long_double_x); r += nextafterl(long_double_x, long_double_x); r += nexttowardl(long_double_x, long_double_x); r += powl(long_double_x, long_double_x); r += remainderl(long_double_x, long_double_x); r += remquol(long_double_x, long_double_x, &int_x); r += rintl(long_double_x); r += roundl(long_double_x); r += scalblnl(long_double_x, long_x); r += scalbnl(long_double_x, int_x); r += sinhl(long_double_x); r += sinl(long_double_x); r += sqrtl(long_double_x); r += tanhl(long_double_x); r += tanl(long_double_x); r += tgammal(long_double_x); r += truncl(long_double_x); return r; }
long double complex csqrtl(long double complex z) { long double complex result; long double a, b; long double t; int scale; a = creall(z); b = cimagl(z); /* Handle special cases. */ if (z == 0) return (cpackl(0, b)); if (isinf(b)) return (cpackl(INFINITY, b)); if (isnan(a)) { t = (b - b) / (b - b); /* raise invalid if b is not a NaN */ return (cpackl(a, t)); /* return NaN + NaN i */ } if (isinf(a)) { /* * csqrt(inf + NaN i) = inf + NaN i * csqrt(inf + y i) = inf + 0 i * csqrt(-inf + NaN i) = NaN +- inf i * csqrt(-inf + y i) = 0 + inf i */ if (signbit(a)) return (cpackl(fabsl(b - b), copysignl(a, b))); else return (cpackl(a, copysignl(b - b, b))); } /* * The remaining special case (b is NaN) is handled just fine by * the normal code path below. */ /* Scale to avoid overflow. */ if (fabsl(a) >= THRESH || fabsl(b) >= THRESH) { a *= 0.25; b *= 0.25; scale = 1; } else { scale = 0; } /* Algorithm 312, CACM vol 10, Oct 1967. */ if (a >= 0) { t = sqrtl((a + hypotl(a, b)) * 0.5); result = cpackl(t, b / (2 * t)); } else { t = sqrtl((-a + hypotl(a, b)) * 0.5); result = cpackl(fabsl(b) / (2 * t), copysignl(t, b)); } /* Rescale. */ if (scale) return (result * 2); else return (result); }
int main(int argc, char *argv[]) { long double x = 0.0; if (argv) x = hypotl((long double) argc, (long double) argc); return 0; }
npy_longdouble npy_hypotl(npy_longdouble x, npy_longdouble y) { return hypotl(x, y); }
TEST(math, hypotl) { ASSERT_DOUBLE_EQ(5.0L, hypotl(3.0L, 4.0L)); }
long double complex clogl(long double complex z) { long double ax, ax2h, ax2l, axh, axl, ay, ay2h, ay2l, ayh, ayl; long double sh, sl, t; long double x, y, v; uint16_t hax, hay; int kx, ky; ENTERIT(long double complex); x = creall(z); y = cimagl(z); v = atan2l(y, x); ax = fabsl(x); ay = fabsl(y); if (ax < ay) { t = ax; ax = ay; ay = t; } GET_LDBL_EXPSIGN(hax, ax); kx = hax - 16383; GET_LDBL_EXPSIGN(hay, ay); ky = hay - 16383; /* Handle NaNs and Infs using the general formula. */ if (kx == MAX_EXP || ky == MAX_EXP) RETURNI(CMPLXL(logl(hypotl(x, y)), v)); /* Avoid spurious underflow, and reduce inaccuracies when ax is 1. */ if (ax == 1) { if (ky < (MIN_EXP - 1) / 2) RETURNI(CMPLXL((ay / 2) * ay, v)); RETURNI(CMPLXL(log1pl(ay * ay) / 2, v)); } /* Avoid underflow when ax is not small. Also handle zero args. */ if (kx - ky > MANT_DIG || ay == 0) RETURNI(CMPLXL(logl(ax), v)); /* Avoid overflow. */ if (kx >= MAX_EXP - 1) RETURNI(CMPLXL(logl(hypotl(x * 0x1p-16382L, y * 0x1p-16382L)) + (MAX_EXP - 2) * ln2l_lo + (MAX_EXP - 2) * ln2_hi, v)); if (kx >= (MAX_EXP - 1) / 2) RETURNI(CMPLXL(logl(hypotl(x, y)), v)); /* Reduce inaccuracies and avoid underflow when ax is denormal. */ if (kx <= MIN_EXP - 2) RETURNI(CMPLXL(logl(hypotl(x * 0x1p16383L, y * 0x1p16383L)) + (MIN_EXP - 2) * ln2l_lo + (MIN_EXP - 2) * ln2_hi, v)); /* Avoid remaining underflows (when ax is small but not denormal). */ if (ky < (MIN_EXP - 1) / 2 + MANT_DIG) RETURNI(CMPLXL(logl(hypotl(x, y)), v)); /* Calculate ax*ax and ay*ay exactly using Dekker's algorithm. */ t = (long double)(ax * (MULT_REDUX + 1)); axh = (long double)(ax - t) + t; axl = ax - axh; ax2h = ax * ax; ax2l = axh * axh - ax2h + 2 * axh * axl + axl * axl; t = (long double)(ay * (MULT_REDUX + 1)); ayh = (long double)(ay - t) + t; ayl = ay - ayh; ay2h = ay * ay; ay2l = ayh * ayh - ay2h + 2 * ayh * ayl + ayl * ayl; /* * When log(|z|) is far from 1, accuracy in calculating the sum * of the squares is not very important since log() reduces * inaccuracies. We depended on this to use the general * formula when log(|z|) is very far from 1. When log(|z|) is * moderately far from 1, we go through the extra-precision * calculations to reduce branches and gain a little accuracy. * * When |z| is near 1, we subtract 1 and use log1p() and don't * leave it to log() to subtract 1, since we gain at least 1 bit * of accuracy in this way. * * When |z| is very near 1, subtracting 1 can cancel almost * 3*MANT_DIG bits. We arrange that subtracting 1 is exact in * doubled precision, and then do the rest of the calculation * in sloppy doubled precision. Although large cancellations * often lose lots of accuracy, here the final result is exact * in doubled precision if the large calculation occurs (because * then it is exact in tripled precision and the cancellation * removes enough bits to fit in doubled precision). Thus the * result is accurate in sloppy doubled precision, and the only * significant loss of accuracy is when it is summed and passed * to log1p(). */ sh = ax2h; sl = ay2h; _2sumF(sh, sl); if (sh < 0.5 || sh >= 3) RETURNI(CMPLXL(logl(ay2l + ax2l + sl + sh) / 2, v)); sh -= 1; _2sum(sh, sl); _2sum(ax2l, ay2l); /* Briggs-Kahan algorithm (except we discard the final low term): */ _2sum(sh, ax2l); _2sum(sl, ay2l); t = ax2l + sl; _2sumF(sh, t); RETURNI(CMPLXL(log1pl(ay2l + t + sh) / 2, v)); }
long double CLANG_PORT_DECL(cabsl) (long double complex Z) { return hypotl ( __real__ Z, __imag__ Z); }
TEST(math, hypotl) { ASSERT_FLOAT_EQ(5.0, hypotl(3.0, 4.0)); }
long double cabsl (long double complex Z) { return hypotl ( __real__ Z, __imag__ Z); }
inline long double _hypot(long double a, long double b) { return hypotl(a, b); }
void domathl (void) { #ifndef NO_LONG_DOUBLE long double f1; long double f2; int i1; f1 = acosl(0.0); fprintf( stdout, "acosl : %Lf\n", f1); f1 = acoshl(0.0); fprintf( stdout, "acoshl : %Lf\n", f1); f1 = asinl(1.0); fprintf( stdout, "asinl : %Lf\n", f1); f1 = asinhl(1.0); fprintf( stdout, "asinhl : %Lf\n", f1); f1 = atanl(M_PI_4); fprintf( stdout, "atanl : %Lf\n", f1); f1 = atan2l(2.3, 2.3); fprintf( stdout, "atan2l : %Lf\n", f1); f1 = atanhl(1.0); fprintf( stdout, "atanhl : %Lf\n", f1); f1 = cbrtl(27.0); fprintf( stdout, "cbrtl : %Lf\n", f1); f1 = ceill(3.5); fprintf( stdout, "ceill : %Lf\n", f1); f1 = copysignl(3.5, -2.5); fprintf( stdout, "copysignl : %Lf\n", f1); f1 = cosl(M_PI_2); fprintf( stdout, "cosl : %Lf\n", f1); f1 = coshl(M_PI_2); fprintf( stdout, "coshl : %Lf\n", f1); f1 = erfl(42.0); fprintf( stdout, "erfl : %Lf\n", f1); f1 = erfcl(42.0); fprintf( stdout, "erfcl : %Lf\n", f1); f1 = expl(0.42); fprintf( stdout, "expl : %Lf\n", f1); f1 = exp2l(0.42); fprintf( stdout, "exp2l : %Lf\n", f1); f1 = expm1l(0.00042); fprintf( stdout, "expm1l : %Lf\n", f1); f1 = fabsl(-1.123); fprintf( stdout, "fabsl : %Lf\n", f1); f1 = fdiml(1.123, 2.123); fprintf( stdout, "fdiml : %Lf\n", f1); f1 = floorl(0.5); fprintf( stdout, "floorl : %Lf\n", f1); f1 = floorl(-0.5); fprintf( stdout, "floorl : %Lf\n", f1); f1 = fmal(2.1, 2.2, 3.01); fprintf( stdout, "fmal : %Lf\n", f1); f1 = fmaxl(-0.42, 0.42); fprintf( stdout, "fmaxl : %Lf\n", f1); f1 = fminl(-0.42, 0.42); fprintf( stdout, "fminl : %Lf\n", f1); f1 = fmodl(42.0, 3.0); fprintf( stdout, "fmodl : %Lf\n", f1); /* no type-specific variant */ i1 = fpclassify(1.0); fprintf( stdout, "fpclassify : %d\n", i1); f1 = frexpl(42.0, &i1); fprintf( stdout, "frexpl : %Lf\n", f1); f1 = hypotl(42.0, 42.0); fprintf( stdout, "hypotl : %Lf\n", f1); i1 = ilogbl(42.0); fprintf( stdout, "ilogbl : %d\n", i1); /* no type-specific variant */ i1 = isfinite(3.0); fprintf( stdout, "isfinite : %d\n", i1); /* no type-specific variant */ i1 = isgreater(3.0, 3.1); fprintf( stdout, "isgreater : %d\n", i1); /* no type-specific variant */ i1 = isgreaterequal(3.0, 3.1); fprintf( stdout, "isgreaterequal : %d\n", i1); /* no type-specific variant */ i1 = isinf(3.0); fprintf( stdout, "isinf : %d\n", i1); /* no type-specific variant */ i1 = isless(3.0, 3.1); fprintf( stdout, "isless : %d\n", i1); /* no type-specific variant */ i1 = islessequal(3.0, 3.1); fprintf( stdout, "islessequal : %d\n", i1); /* no type-specific variant */ i1 = islessgreater(3.0, 3.1); fprintf( stdout, "islessgreater : %d\n", i1); /* no type-specific variant */ i1 = isnan(0.0); fprintf( stdout, "isnan : %d\n", i1); /* no type-specific variant */ i1 = isnormal(3.0); fprintf( stdout, "isnormal : %d\n", i1); /* no type-specific variant */ f1 = isunordered(1.0, 2.0); fprintf( stdout, "isunordered : %d\n", i1); f1 = j0l(1.2); fprintf( stdout, "j0l : %Lf\n", f1); f1 = j1l(1.2); fprintf( stdout, "j1l : %Lf\n", f1); f1 = jnl(2,1.2); fprintf( stdout, "jnl : %Lf\n", f1); f1 = ldexpl(1.2,3); fprintf( stdout, "ldexpl : %Lf\n", f1); f1 = lgammal(42.0); fprintf( stdout, "lgammal : %Lf\n", f1); f1 = llrintl(-0.5); fprintf( stdout, "llrintl : %Lf\n", f1); f1 = llrintl(0.5); fprintf( stdout, "llrintl : %Lf\n", f1); f1 = llroundl(-0.5); fprintf( stdout, "lroundl : %Lf\n", f1); f1 = llroundl(0.5); fprintf( stdout, "lroundl : %Lf\n", f1); f1 = logl(42.0); fprintf( stdout, "logl : %Lf\n", f1); f1 = log10l(42.0); fprintf( stdout, "log10l : %Lf\n", f1); f1 = log1pl(42.0); fprintf( stdout, "log1pl : %Lf\n", f1); f1 = log2l(42.0); fprintf( stdout, "log2l : %Lf\n", f1); f1 = logbl(42.0); fprintf( stdout, "logbl : %Lf\n", f1); f1 = lrintl(-0.5); fprintf( stdout, "lrintl : %Lf\n", f1); f1 = lrintl(0.5); fprintf( stdout, "lrintl : %Lf\n", f1); f1 = lroundl(-0.5); fprintf( stdout, "lroundl : %Lf\n", f1); f1 = lroundl(0.5); fprintf( stdout, "lroundl : %Lf\n", f1); f1 = modfl(42.0,&f2); fprintf( stdout, "lmodfl : %Lf\n", f1); f1 = nanl(""); fprintf( stdout, "nanl : %Lf\n", f1); f1 = nearbyintl(1.5); fprintf( stdout, "nearbyintl : %Lf\n", f1); f1 = nextafterl(1.5,2.0); fprintf( stdout, "nextafterl : %Lf\n", f1); f1 = powl(3.01, 2.0); fprintf( stdout, "powl : %Lf\n", f1); f1 = remainderl(3.01,2.0); fprintf( stdout, "remainderl : %Lf\n", f1); f1 = remquol(29.0,3.0,&i1); fprintf( stdout, "remquol : %Lf\n", f1); f1 = rintl(0.5); fprintf( stdout, "rintl : %Lf\n", f1); f1 = rintl(-0.5); fprintf( stdout, "rintl : %Lf\n", f1); f1 = roundl(0.5); fprintf( stdout, "roundl : %Lf\n", f1); f1 = roundl(-0.5); fprintf( stdout, "roundl : %Lf\n", f1); f1 = scalblnl(1.2,3); fprintf( stdout, "scalblnl : %Lf\n", f1); f1 = scalbnl(1.2,3); fprintf( stdout, "scalbnl : %Lf\n", f1); /* no type-specific variant */ i1 = signbit(1.0); fprintf( stdout, "signbit : %i\n", i1); f1 = sinl(M_PI_4); fprintf( stdout, "sinl : %Lf\n", f1); f1 = sinhl(M_PI_4); fprintf( stdout, "sinhl : %Lf\n", f1); f1 = sqrtl(9.0); fprintf( stdout, "sqrtl : %Lf\n", f1); f1 = tanl(M_PI_4); fprintf( stdout, "tanl : %Lf\n", f1); f1 = tanhl(M_PI_4); fprintf( stdout, "tanhl : %Lf\n", f1); f1 = tgammal(2.1); fprintf( stdout, "tgammal : %Lf\n", f1); f1 = truncl(3.5); fprintf( stdout, "truncl : %Lf\n", f1); f1 = y0l(1.2); fprintf( stdout, "y0l : %Lf\n", f1); f1 = y1l(1.2); fprintf( stdout, "y1l : %Lf\n", f1); f1 = ynl(3,1.2); fprintf( stdout, "ynl : %Lf\n", f1); #endif }
long double hypotl(long double x, long double y) { int n0, n1, n2, n3; long double t1, t2, y1, y2, w; int *px = (int *) &x, *py = (int *) &y; int *pt1 = (int *) &t1, *py1 = (int *) &y1; enum fp_direction_type rd; int j, k, nx, ny, nz; if ((*(int *) &one) != 0) { /* determine word ordering */ n0 = 0; n1 = 1; n2 = 2; n3 = 3; } else { n0 = 3; n1 = 2; n2 = 1; n3 = 0; } px[n0] &= 0x7fffffff; /* clear sign bit of x and y */ py[n0] &= 0x7fffffff; k = 0x7fff0000; nx = px[n0] & k; /* exponent of x and y */ ny = py[n0] & k; if (ny > nx) { w = x; x = y; y = w; nz = ny; ny = nx; nx = nz; } /* force x > y */ if ((nx - ny) >= 0x00730000) return (x + y); /* x/y >= 2**116 */ if (nx < 0x5ff30000 && ny > 0x205b0000) { /* medium x,y */ /* save and set RD to Rounding to nearest */ rd = __swapRD(fp_nearest); w = x - y; if (w > y) { pt1[n0] = px[n0]; pt1[n1] = px[n1]; pt1[n2] = pt1[n3] = 0; t2 = x - t1; x = sqrtl(t1 * t1 - (y * (-y) - t2 * (x + t1))); } else { x = x + x; py1[n0] = py[n0]; py1[n1] = py[n1]; py1[n2] = py1[n3] = 0; y2 = y - y1; pt1[n0] = px[n0]; pt1[n1] = px[n1]; pt1[n2] = pt1[n3] = 0; t2 = x - t1; x = sqrtl(t1 * y1 - (w * (-w) - (t2 * y1 + y2 * x))); } if (rd != fp_nearest) (void) __swapRD(rd); /* restore rounding mode */ return (x); } else { if (nx == k || ny == k) { /* x or y is INF or NaN */ if (isinfl(x)) t2 = x; else if (isinfl(y)) t2 = y; else t2 = x + y; /* invalid if x or y is sNaN */ return (t2); } if (ny == 0) { if (y == zero || x == zero) return (x + y); t1 = scalbnl(one, 16381); x *= t1; y *= t1; return (scalbnl(one, -16381) * hypotl(x, y)); } j = nx - 0x3fff0000; px[n0] -= j; py[n0] -= j; pt1[n0] = nx; pt1[n1] = pt1[n2] = pt1[n3] = 0; return (t1 * hypotl(x, y)); } }
void test2l(long double x, long double y) { if (-tanl(x-y) != tanl(y-x)) link_error (); if (-sinl(x-y) != sinl(y-x)) link_error (); if (cosl(-x*y) != cosl(x*y)) link_error (); if (cosl(x*-y) != cosl(x*y)) link_error (); if (cosl(-x/y) != cosl(x/y)) link_error (); if (cosl(x/-y) != cosl(x/y)) link_error (); if (cosl(-fabsl(tanl(x/-y))) != cosl(tanl(x/y))) link_error (); if (cosl(y<10 ? -x : y) != cosl(y<10 ? x : y)) link_error (); if (cosl(y<10 ? x : -y) != cosl(y<10 ? x : y)) link_error (); if (cosl(y<10 ? -fabsl(x) : tanl(x<20 ? -x : -fabsl(y))) != cosl(y<10 ? x : tanl(x<20 ? x : y))) link_error (); if (cosl((y*=3, -x)) != cosl((y*=3,x))) link_error (); if (cosl((y*=2, -fabsl(tanl(x/-y)))) != cosl((y*=2,tanl(x/y)))) link_error (); if (cosl(copysignl(x,y)) != cosl(x)) link_error (); if (cosl(copysignl(-fabsl(x),y*=2)) != cosl((y*=2,x))) link_error (); if (hypotl (x, 0) != fabsl(x)) link_error (); if (hypotl (0, x) != fabsl(x)) link_error (); if (hypotl (x, x) != fabsl(x) * __builtin_sqrtl(2)) link_error (); if (hypotl (-x, y) != hypotl (x, y)) link_error (); if (hypotl (x, -y) != hypotl (x, y)) link_error (); if (hypotl (-x, -y) != hypotl (x, y)) link_error (); if (hypotl (fabsl(x), y) != hypotl (x, y)) link_error (); if (hypotl (x, fabsl(y)) != hypotl (x, y)) link_error (); if (hypotl (fabsl(x), fabsl(y)) != hypotl (x, y)) link_error (); if (hypotl (-fabsl(-x), -fabsl(fabsl(fabsl(-y)))) != hypotl (x, y)) link_error (); if (hypotl (-x, 0) != fabsl(x)) link_error (); if (hypotl (-x, x) != fabsl(x) * __builtin_sqrtl(2)) link_error (); if (hypotl (purel(x), -purel(x)) != fabsl(purel(x)) * __builtin_sqrtl(2)) link_error (); if (hypotl (tanl(-x), tanl(-fabsl(y))) != hypotl (tanl(x), tanl(y))) link_error (); if (fminl (fmaxl(x,y),y) != y) link_error (); if (fminl (fmaxl(y,x),y) != y) link_error (); if (fminl (x,fmaxl(x,y)) != x) link_error (); if (fminl (x,fmaxl(y,x)) != x) link_error (); if (fmaxl (fminl(x,y),y) != y) link_error (); if (fmaxl (fminl(y,x),y) != y) link_error (); if (fmaxl (x,fminl(x,y)) != x) link_error (); if (fmaxl (x,fminl(y,x)) != x) link_error (); if ((__complex__ long double) x != -(__complex__ long double) (-x)) link_error (); if (x+(x-y)*1i != -(-x+(y-x)*1i)) link_error (); if (x+(x-y)*1i != -(-x-(x-y)*1i)) link_error (); if (ccosl(tanl(x)+sinl(y)*1i) != ccosl(-tanl(-x)+-sinl(-y)*1i)) link_error (); if (ccosl(tanl(x)+sinl(x-y)*1i) != ccosl(-tanl(-x)-sinl(y-x)*1i)) link_error (); if (-5+x*1i != -~(5+x*1i)) link_error (); if (tanl(x)+tanl(y)*1i != -~(tanl(-x)+tanl(y)*1i)) link_error (); }
void CMainWnd::OnPaint() { Object A{ 2.680795435464e+20, -1.531367579292792e+12, 0.0, 0.0, -1.923828617202e+3 * M_PI / 1.581035760 * sqrtl(5.1/19.9), 0.0, 0.0, 1.40491e+9 }; Object B{ 1.2979296712296e+20, 3.19134145606896e+12, 0.0, 0.0, 4.009222934760e+3 * M_PI / 1.581035760 * sqrtl(5.1 / 19.9), 0.0, 0.0, 5.8422e+7 }; CPaintDC dc(this); RECT rect; GetClientRect(&rect); long double x = rect.right; //Ширина окна long double y = rect.bottom; //Высота окна dc.FillSolidRect(0, 0, lrintl(x), lrintl(y), RGB(0, 0, 0)); CPen Line(PS_SOLID, 1, RGB(255, 255, 255)); CBrush Star1(RGB(255,255,255)); CBrush Star2(RGB(0, 0, 0)); CBrush BPlanetoid(RGB(0, 127, 127)); CPen Planetoid(PS_SOLID, 1, RGB(0, 127, 127)); CPen Background(PS_SOLID, 1, RGB(0, 0, 0)); dc.SetTextColor(RGB(255, 255, 255)); dc.TextOutW(5, 5, "Координаты планеты, а.е."); dc.TextOutW(5, 65, "Скорость планеты, км/с"); long double h = 5.0e+4; long double max = 3.2e+12; dc.MoveTo(lrintl(x / 2 + y / 2.0*A.x / max), lrintl(y / 2.0*(1.0 - A.y / max))); for (long double t = 0; t < T; t += h){ long double dx = B.x - A.x, dy = B.y - A.y; long double R = hypotl(dx, dy); long double cosinus = dx / R, sinus = dy / R; R *= R; // Сириус А A.ax = B.GM / R * cosinus; A.ay = B.GM / R * sinus; A.vx += h*A.ax; A.vy += h*A.ay; // Сириус Б B.ax = -A.GM / R * cosinus; B.ay = -A.GM / R * sinus; B.vx += h*B.ax; B.vy += h*B.ay; dx = Planet.x - A.x, dy = Planet.y - A.y; R = hypotl(dx, dy); cosinus = dx / R; sinus = dy / R; R *= R; Planet.ax = -A.GM / R * cosinus; Planet.ay = -A.GM / R * sinus; dx = Planet.x - B.x; dy = Planet.y - B.y; R = hypotl(dx, dy); cosinus = dx / R; sinus = dy / R; R *= R; Planet.ax += -B.GM / R * cosinus; Planet.ay += -B.GM / R * sinus; Planet.vx += h*Planet.ax; Planet.vy += h*Planet.ay; bool k = (llrintl(t) % 1000 == 0); if (k){ dc.SelectObject(Line); dc.MoveTo(0, lrintl(y / 2)); dc.LineTo(lrintl(x), lrintl(y / 2)); dc.MoveTo(lrintl(x / 2), 0); dc.LineTo(lrintl(x / 2), lrintl(y)); }; if (k){ dc.SelectObject(Background); dc.SelectObject(Star2); dc.Ellipse(lrintl(x / 2 + y / 2.0*A.x / max) - 7, lrintl(y / 2.0*(1.0 - A.y / max)) - 7, lrintl(x / 2 + y / 2.0*A.x / max) + 7, lrintl(y / 2.0*(1.0 - A.y / max)) + 7); }; A.x += h*A.vx; A.y += h*A.vy; if (k){ dc.SelectObject(Star1); dc.Ellipse(lrintl(x / 2 + y / 2.0*A.x / max) - 7, lrintl(y / 2.0*(1.0 - A.y / max)) - 7, lrintl(x / 2 + y / 2.0*A.x / max) + 7, lrintl(y / 2.0*(1.0 - A.y / max)) + 7); }; //dc.LineTo(lrintl(x / 2 + y / 2.0*A.x / max), lrintl(y / 2.0*(1.0 - A.y / max))); //dc.MoveTo(lrintl(x / 2 + y / 2.0*B.x / max), lrintl(y / 2.0*(1.0 - B.y / max))); if (k){ dc.SelectObject(Background); dc.SelectObject(Star2); dc.Ellipse(lrintl(x / 2 + y / 2.0*B.x / max) - 5, lrintl(y / 2.0*(1.0 - B.y / max)) - 5, lrintl(x / 2 + y / 2.0*B.x / max) + 5, lrintl(y / 2.0*(1.0 - B.y / max)) + 5); }; B.x += h*B.vx; B.y += h*B.vy; if (k){ dc.SelectObject(Star1); dc.Ellipse(lrintl(x / 2 + y / 2.0*B.x / max) - 5, lrintl(y / 2.0*(1.0 - B.y / max)) - 5, lrintl(x / 2 + y / 2.0*B.x / max) + 5, lrintl(y / 2.0*(1.0 - B.y / max)) + 5); }; if (k){ dc.SelectObject(Background); dc.SelectObject(Star2); dc.Ellipse(lrintl(x / 2 + y / 2.0*Planet.x / max) - 3, lrintl(y / 2.0*(1.0 - Planet.y / max)) - 3, lrintl(x / 2 + y / 2.0*Planet.x / max) + 3, lrintl(y / 2.0*(1.0 - Planet.y / max)) + 3); }; Planet.x += h*Planet.vx; Planet.y += h*Planet.vy; if (k){ dc.SelectObject(BPlanetoid); dc.Ellipse(lrintl(x / 2 + y / 2.0*Planet.x / max) - 3, lrintl(y / 2.0*(1.0 - Planet.y / max)) - 3, lrintl(x / 2 + y / 2.0*Planet.x / max) + 3, lrintl(y / 2.0*(1.0 - Planet.y / max)) + 3); }; if ((hypotl(Planet.x - A.x, Planet.y - A.y) < A.R + Planet.R) || (hypotl(Planet.x - B.x, Planet.y - B.y) < B.R + Planet.R) || (fabsl(x/2.0*Planet.x / max)>x) || (fabsl(y/2.0*Planet.y / max)>y)) break; /* //dc.LineTo(lrintl(x / 2 + y / 2.0*B.x / max), lrintl(y / 2.0*(1.0 - B.y / max))); dc.SelectObject(Planetoid); dc.MoveTo(lrintl(x / 2 + y / 2.0*Planet.x / max), lrintl(y / 2.0*(1.0 - Planet.y / max))); Planet.x += h*Planet.vx; Planet.y += h*Planet.vy; dc.LineTo(lrintl(x / 2 + y / 2.0*Planet.x / max), lrintl(y / 2.0*(1.0 - Planet.y / max))); //dc.MoveTo(lrintl(x / 2 + y / 2.0*A.x / max), lrintl(y / 2.0*(1.0 - A.y / max))); */ } }
long double cabsl(long double complex z) { return hypotl(__real__ z, __imag__ z); }
double hypot(double x, double y) { return (double)hypotl(x, y); }