📄 geometricpredicates.cpp
字号:
#define Four_One_Product(a3, a2, a1, a0, b, x7, x6, x5, x4, x3, x2, x1, x0) \ Split(b, bhi, blo); \ Two_Product_Presplit(a0, b, bhi, blo, _i, x0); \ Two_Product_Presplit(a1, b, bhi, blo, _j, _0); \ Two_Sum(_i, _0, _k, x1); \ Fast_Two_Sum(_j, _k, _i, x2); \ Two_Product_Presplit(a2, b, bhi, blo, _j, _0); \ Two_Sum(_i, _0, _k, x3); \ Fast_Two_Sum(_j, _k, _i, x4); \ Two_Product_Presplit(a3, b, bhi, blo, _j, _0); \ Two_Sum(_i, _0, _k, x5); \ Fast_Two_Sum(_j, _k, x7, x6)#define Two_Two_Product(a1, a0, b1, b0, x7, x6, x5, x4, x3, x2, x1, x0) \ Split(a0, a0hi, a0lo); \ Split(b0, bhi, blo); \ Two_Product_2Presplit(a0, a0hi, a0lo, b0, bhi, blo, _i, x0); \ Split(a1, a1hi, a1lo); \ Two_Product_2Presplit(a1, a1hi, a1lo, b0, bhi, blo, _j, _0); \ Two_Sum(_i, _0, _k, _1); \ Fast_Two_Sum(_j, _k, _l, _2); \ Split(b1, bhi, blo); \ Two_Product_2Presplit(a0, a0hi, a0lo, b1, bhi, blo, _i, _0); \ Two_Sum(_1, _0, _k, x1); \ Two_Sum(_2, _k, _j, _1); \ Two_Sum(_l, _j, _m, _2); \ Two_Product_2Presplit(a1, a1hi, a1lo, b1, bhi, blo, _j, _0); \ Two_Sum(_i, _0, _n, _0); \ Two_Sum(_1, _0, _i, x2); \ Two_Sum(_2, _i, _k, _1); \ Two_Sum(_m, _k, _l, _2); \ Two_Sum(_j, _n, _k, _0); \ Two_Sum(_1, _0, _j, x3); \ Two_Sum(_2, _j, _i, _1); \ Two_Sum(_l, _i, _m, _2); \ Two_Sum(_1, _k, _i, x4); \ Two_Sum(_2, _i, _k, x5); \ Two_Sum(_m, _k, x7, x6)/* An expansion of length two can be squared more quickly than finding the *//* product of two different expansions of length two, and the result is *//* guaranteed to have no more than six (rather than eight) components. */#define Two_Square(a1, a0, x5, x4, x3, x2, x1, x0) \ Square(a0, _j, x0); \ _0 = a0 + a0; \ Two_Product(a1, _0, _k, _1); \ Two_One_Sum(_k, _1, _j, _l, _2, x1); \ Square(a1, _j, _1); \ Two_Two_Sum(_j, _1, _l, _2, x5, x4, x3, x2)#ifndef USE_PREDICATES_INITstatic REAL splitter; /* = 2^ceiling(p / 2) + 1. Used to split floats in half. *//* A set of coefficients used to calculate maximum roundoff errors. */static REAL resulterrbound;static REAL ccwerrboundA, ccwerrboundB, ccwerrboundC;static REAL o3derrboundA, o3derrboundB, o3derrboundC;static REAL iccerrboundA, iccerrboundB, iccerrboundC;static REAL isperrboundA, isperrboundB, isperrboundC;#endif /* USE_PREDICATES_INIT *//*****************************************************************************//* *//* doubleprint() Print the bit representation of a double. *//* *//* Useful for debugging exact arithmetic routines. *//* *//*****************************************************************************//*void doubleprint(number)double number;{ unsigned long long no; unsigned long long sign, expo; int exponent; int i, bottomi; no = *(unsigned long long *) &number; sign = no & 0x8000000000000000ll; expo = (no >> 52) & 0x7ffll; exponent = (int) expo; exponent = exponent - 1023; if (sign) { printf("-"); } else { printf(" "); } if (exponent == -1023) { printf( "0.0000000000000000000000000000000000000000000000000000_ ( )"); } else { printf("1."); bottomi = -1; for (i = 0; i < 52; i++) { if (no & 0x0008000000000000ll) { printf("1"); bottomi = i; } else { printf("0"); } no <<= 1; } printf("_%d (%d)", exponent, exponent - 1 - bottomi); }}*//*****************************************************************************//* *//* floatprint() Print the bit representation of a float. *//* *//* Useful for debugging exact arithmetic routines. *//* *//*****************************************************************************//*void floatprint(number)float number;{ unsigned no; unsigned sign, expo; int exponent; int i, bottomi; no = *(unsigned *) &number; sign = no & 0x80000000; expo = (no >> 23) & 0xff; exponent = (int) expo; exponent = exponent - 127; if (sign) { printf("-"); } else { printf(" "); } if (exponent == -127) { printf("0.00000000000000000000000_ ( )"); } else { printf("1."); bottomi = -1; for (i = 0; i < 23; i++) { if (no & 0x00400000) { printf("1"); bottomi = i; } else { printf("0"); } no <<= 1; } printf("_%3d (%3d)", exponent, exponent - 1 - bottomi); }}*//*****************************************************************************//* *//* expansion_print() Print the bit representation of an expansion. *//* *//* Useful for debugging exact arithmetic routines. *//* *//*****************************************************************************//*void expansion_print(elen, e)int elen;REAL *e;{ int i; for (i = elen - 1; i >= 0; i--) { REALPRINT(e[i]); if (i > 0) { printf(" +\n"); } else { printf("\n"); } }}*//*****************************************************************************//* *//* doublerand() Generate a double with random 53-bit significand and a *//* random exponent in [0, 511]. *//* *//*****************************************************************************//*static double doublerand(){ double result; double expo; long a, b, c; long i; a = random(); b = random(); c = random(); result = (double) (a - 1073741824) * 8388608.0 + (double) (b >> 8); for (i = 512, expo = 2; i <= 131072; i *= 2, expo = expo * expo) { if (c & i) { result *= expo; } } return result;}*//*****************************************************************************//* *//* narrowdoublerand() Generate a double with random 53-bit significand *//* and a random exponent in [0, 7]. *//* *//*****************************************************************************//*static double narrowdoublerand(){ double result; double expo; long a, b, c; long i; a = random(); b = random(); c = random(); result = (double) (a - 1073741824) * 8388608.0 + (double) (b >> 8); for (i = 512, expo = 2; i <= 2048; i *= 2, expo = expo * expo) { if (c & i) { result *= expo; } } return result;}*//*****************************************************************************//* *//* uniformdoublerand() Generate a double with random 53-bit significand. *//* *//*****************************************************************************//*static double uniformdoublerand(){ double result; long a, b; a = random(); b = random(); result = (double) (a - 1073741824) * 8388608.0 + (double) (b >> 8); return result;}*//*****************************************************************************//* *//* floatrand() Generate a float with random 24-bit significand and a *//* random exponent in [0, 63]. *//* *//*****************************************************************************//*static float floatrand(){ float result; float expo; long a, c; long i; a = random(); c = random(); result = (float) ((a - 1073741824) >> 6); for (i = 512, expo = 2; i <= 16384; i *= 2, expo = expo * expo) { if (c & i) { result *= expo; } } return result;}*//*****************************************************************************//* *//* narrowfloatrand() Generate a float with random 24-bit significand and *//* a random exponent in [0, 7]. *//* *//*****************************************************************************//*static float narrowfloatrand(){ float result; float expo; long a, c; long i; a = random(); c = random(); result = (float) ((a - 1073741824) >> 6); for (i = 512, expo = 2; i <= 2048; i *= 2, expo = expo * expo) { if (c & i) { result *= expo; } } return result;}*//*****************************************************************************//* *//* uniformfloatrand() Generate a float with random 24-bit significand. *//* *//*****************************************************************************//*static float uniformfloatrand(){ float result; long a; a = random(); result = (float) ((a - 1073741824) >> 6); return result;}*//*****************************************************************************//* *//* fast_expansion_sum_zeroelim() Sum two expansions, eliminating zero *//* components from the output expansion. *//* */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -