- if (SCM_NINUMP (x))
- {
- SCM t;
-#ifdef SCM_BIGDIG
- if (!SCM_NIMP (x))
- {
- badx2:
- SCM_WTA_DISPATCH_2 (g_product, x, y, SCM_ARG1, s_product);
- }
- if (SCM_BIGP (x))
- {
- if (SCM_INUMP (y))
- {
- t = x;
- x = y;
- y = t;
- goto intbig;
- }
- SCM_ASRTGO (SCM_NIMP (y), bady);
- if (SCM_BIGP (y))
- return scm_mulbig (SCM_BDIGITS (x), SCM_NUMDIGS (x),
- SCM_BDIGITS (y), SCM_NUMDIGS (y),
- SCM_BIGSIGN (x) ^ SCM_BIGSIGN (y));
- SCM_ASRTGO (SCM_SLOPPY_INEXACTP (y), bady);
- bigreal:
- {
- double bg = scm_big2dbl (x);
- return scm_makdbl (bg * SCM_REALPART (y),
- SCM_SLOPPY_COMPLEXP (y) ? bg * SCM_IMAG (y) : 0.0);
- }
- }
- SCM_ASRTGO (SCM_SLOPPY_INEXACTP (x), badx2);
-#else
- SCM_ASRTGO (SCM_SLOPPY_INEXACTP (x), badx2);
-#endif
- if (SCM_INUMP (y))
- {
- t = x;
- x = y;
- y = t;
- goto intreal;
- }
-#ifdef SCM_BIGDIG
- SCM_ASRTGO (SCM_NIMP (y), bady);
- if (SCM_BIGP (y))
- {
- t = x;
- x = y;
- y = t;
- goto bigreal;
- }
- else if (!(SCM_SLOPPY_INEXACTP (y)))
- {
- bady:
- SCM_WTA_DISPATCH_2 (g_product, x, y, SCM_ARGn, s_product);
- }
-#else
- if (!SCM_SLOPPY_INEXACTP (y))
- {
- bady:
- SCM_WTA_DISPATCH_2 (g_product, x, y, SCM_ARGn, s_product);
- }
-#endif
- if (SCM_SLOPPY_COMPLEXP (x))
- {
- if (SCM_SLOPPY_COMPLEXP (y))
- return scm_makdbl (SCM_REAL (x) * SCM_REAL (y)
- - SCM_IMAG (x) * SCM_IMAG (y),
- SCM_REAL (x) * SCM_IMAG (y)
- + SCM_IMAG (x) * SCM_REAL (y));
- else
- return scm_makdbl (SCM_REAL (x) * SCM_REALPART (y),
- SCM_IMAG (x) * SCM_REALPART (y));
- }
- return scm_makdbl (SCM_REALPART (x) * SCM_REALPART (y),
- SCM_SLOPPY_COMPLEXP (y)
- ? SCM_REALPART (x) * SCM_IMAG (y)
- : 0.0);
- }
- if (SCM_NINUMP (y))
- {
-#ifdef SCM_BIGDIG
- SCM_ASRTGO (SCM_NIMP (y), bady);
- if (SCM_BIGP (y))
- {
- intbig:
- if (SCM_EQ_P (x, SCM_INUM0))
- return x;
- if (SCM_EQ_P (x, SCM_MAKINUM (1L)))
- return y;
- {
-#ifndef SCM_DIGSTOOBIG
- long z = scm_pseudolong (SCM_INUM (x));
- return scm_mulbig ((SCM_BIGDIG *) & z, SCM_DIGSPERLONG,
- SCM_BDIGITS (y), SCM_NUMDIGS (y),
- SCM_BIGSIGN (y) ? (x > 0) : (x < 0));
-#else
- SCM_BIGDIG zdigs[SCM_DIGSPERLONG];
- scm_longdigs (SCM_INUM (x), zdigs);
- return scm_mulbig (zdigs, SCM_DIGSPERLONG,
- SCM_BDIGITS (y), SCM_NUMDIGS (y),
- SCM_BIGSIGN (y) ? (x > 0) : (x < 0));
-#endif
- }
- }
- SCM_ASRTGO (SCM_SLOPPY_INEXACTP (y), bady);
-#else
- SCM_ASRTGO (SCM_SLOPPY_INEXACTP (y), bady);
-#endif
- intreal:
- return scm_makdbl (SCM_INUM (x) * SCM_REALPART (y),
- SCM_SLOPPY_COMPLEXP (y) ? SCM_INUM (x) * SCM_IMAG (y) : 0.0);
- }
- {
- long i, j, k;
- i = SCM_INUM (x);
- if (0 == i)