⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trionan.c

📁 一个C语言写的快速贝叶斯垃圾邮件过滤工具
💻 C
📖 第 1 页 / 共 2 页
字号:
  /*   * Examine IEEE 754 bit-pattern. A NaN must have a special exponent   * pattern, and a non-empty mantissa.   */  int has_mantissa;  int is_special_quantity;  is_special_quantity = internal_is_special_quantity(number, &has_mantissa);    return (is_special_quantity && has_mantissa);  # endif# if defined(TRIO_INTERNAL_ISNAN_FALLBACK)    /*   * Fallback solution   */  int status;  double integral, fraction;  #  if defined(TRIO_PLATFORM_UNIX)  void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN);#  endif    status = (/*	     * NaN is the only number which does not compare to itself	     */	    ((TRIO_VOLATILE double)number != (TRIO_VOLATILE double)number) ||	    /*	     * Fallback solution if NaN compares to NaN	     */	    ((number != 0.0) &&	     (fraction = modf(number, &integral),	      integral == fraction)));  #  if defined(TRIO_PLATFORM_UNIX)  signal(SIGFPE, signal_handler);#  endif    return status;  # endif}#endif /* TRIO_FUNC_INTERNAL_ISNAN */#if defined(TRIO_FUNC_INTERNAL_ISINF)TRIO_PRIVATE_NAN TRIO_INLINE intinternal_isinfTRIO_ARGS1((number),	   double number){# if defined(TRIO_PLATFORM_SYMBIAN)  return isinf(number);# endif# if defined(TRIO_INTERNAL_ISINF_IEEE_754)  /*   * Examine IEEE 754 bit-pattern. Infinity must have a special exponent   * pattern, and an empty mantissa.   */  int has_mantissa;  int is_special_quantity;  is_special_quantity = internal_is_special_quantity(number, &has_mantissa);    return (is_special_quantity && !has_mantissa)    ? ((number < 0.0) ? -1 : 1)    : 0;# endif# if defined(TRIO_INTERNAL_ISINF_FALLBACK)    /*   * Fallback solution.   */  int status;  #  if defined(TRIO_PLATFORM_UNIX)  void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN);#  endif    double infinity = trio_pinf();    status = ((number == infinity)	    ? 1	    : ((number == -infinity) ? -1 : 0));  #  if defined(TRIO_PLATFORM_UNIX)  signal(SIGFPE, signal_handler);#  endif    return status;# endif}#endif /* TRIO_FUNC_INTERNAL_ISINF *//************************************************************************* * Public functions */#if defined(TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT)TRIO_PUBLIC_NAN inttrio_fpclassify_and_signbitTRIO_ARGS2((number, is_negative),	   double number,	   int *is_negative){  /* The TRIO_FUNC_xxx_FPCLASSIFY_AND_SIGNBIT macros are mutually exclusive */  #if defined(TRIO_FUNC_C99_FPCLASSIFY_AND_SIGNBIT)  return c99_fpclassify_and_signbit(number, is_negative);#endif#if defined(TRIO_FUNC_DECC_FPCLASSIFY_AND_SIGNBIT)  return decc_fpclassify_and_signbit(number, is_negative);#endif#if defined(TRIO_FUNC_MS_FPCLASSIFY_AND_SIGNBIT)  return ms_fpclassify_and_signbit(number, is_negative);#endif#if defined(TRIO_FUNC_HP_FPCLASSIFY_AND_SIGNBIT)  return hp_fpclassify_and_signbit(number, is_negative);#endif#if defined(TRIO_FUNC_XLC_FPCLASSIFY_AND_SIGNBIT)  return xlc_fpclassify_and_signbit(number, is_negative);#endif#if defined(TRIO_FUNC_INTERNAL_FPCLASSIFY_AND_SIGNBIT)    /*   * Fallback solution.   */  int rc;    if (number == 0.0) {    /*     * In IEEE 754 the sign of zero is ignored in comparisons, so we     * have to handle this as a special case by examining the sign bit     * directly.     */# if defined(TRIO_IEEE_754)    *is_negative = internal_is_negative(number);# else    *is_negative = TRIO_FALSE; /* FIXME */# endif    return TRIO_FP_ZERO;  }  if (internal_isnan(number)) {    *is_negative = TRIO_FALSE;    return TRIO_FP_NAN;  }  rc = internal_isinf(number);  if (rc != 0) {    *is_negative = (rc == -1);    return TRIO_FP_INFINITE;  }  if ((number > 0.0) && (number < DBL_MIN)) {    *is_negative = TRIO_FALSE;    return TRIO_FP_SUBNORMAL;  }  if ((number < 0.0) && (number > -DBL_MIN)) {    *is_negative = TRIO_TRUE;    return TRIO_FP_SUBNORMAL;  }  *is_negative = (number < 0.0);  return TRIO_FP_NORMAL;#endif}#endif/**   Check for NaN.   @param number An arbitrary floating-point number.   @return Boolean value indicating whether or not the number is a NaN.*/#if defined(TRIO_FUNC_ISNAN)TRIO_PUBLIC_NAN inttrio_isnanTRIO_ARGS1((number),	   double number){  int dummy;    return (trio_fpclassify_and_signbit(number, &dummy) == TRIO_FP_NAN);}#endif/**   Check for infinity.   @param number An arbitrary floating-point number.   @return 1 if positive infinity, -1 if negative infinity, 0 otherwise.*/#if defined(TRIO_FUNC_ISINF)TRIO_PUBLIC_NAN inttrio_isinfTRIO_ARGS1((number),	   double number){  int is_negative;    if (trio_fpclassify_and_signbit(number, &is_negative) == TRIO_FP_INFINITE)    {      return (is_negative) ? -1 : 1;    }  else    {      return 0;    }}#endif/**   Check for finity.   @param number An arbitrary floating-point number.   @return Boolean value indicating whether or not the number is a finite.*/#if defined(TRIO_FUNC_ISFINITE)TRIO_PUBLIC_NAN inttrio_isfiniteTRIO_ARGS1((number),	   double number){  int dummy;    switch (trio_fpclassify_and_signbit(number, &dummy))    {    case TRIO_FP_INFINITE:    case TRIO_FP_NAN:      return 0;    default:      return 1;    }}#endif/**   Examine the sign of a number.   @param number An arbitrary floating-point number.   @return Boolean value indicating whether or not the number has the   sign bit set (i.e. is negative).*/#if defined(TRIO_FUNC_SIGNBIT)TRIO_PUBLIC_NAN inttrio_signbitTRIO_ARGS1((number),	   double number){  int is_negative;    (void)trio_fpclassify_and_signbit(number, &is_negative);  return is_negative;}#endif/**   Examine the class of a number.   @param number An arbitrary floating-point number.   @return Enumerable value indicating the class of @p number*/#if defined(TRIO_FUNC_FPCLASSIFY)TRIO_PUBLIC_NAN inttrio_fpclassifyTRIO_ARGS1((number),	   double number){  int dummy;    return trio_fpclassify_and_signbit(number, &dummy);}#endif/**   Generate negative zero.   @return Floating-point representation of negative zero.*/#if defined(TRIO_FUNC_NZERO)TRIO_PUBLIC_NAN doubletrio_nzero(TRIO_NOARGS){# if defined(TRIO_NZERO_IEEE_754)    return internal_make_double(ieee_754_negzero_array);# endif  # if defined(TRIO_NZERO_FALLBACK)    TRIO_VOLATILE double zero = 0.0;  return -zero;  # endif}#endif/**   Generate positive infinity.   @return Floating-point representation of positive infinity.*/#if defined(TRIO_FUNC_PINF)TRIO_PUBLIC_NAN doubletrio_pinf(TRIO_NOARGS){  /* Cache the result */  static double pinf_value = 0.0;  if (pinf_value == 0.0) {# if defined(TRIO_PINF_C99_MACRO)        pinf_value = (double)INFINITY;# endif    # if defined(TRIO_PINF_IEEE_754)        pinf_value = internal_make_double(ieee_754_infinity_array);# endif# if defined(TRIO_PINF_FALLBACK)    /*     * If HUGE_VAL is different from DBL_MAX, then HUGE_VAL is used     * as infinity. Otherwise we have to resort to an overflow     * operation to generate infinity.     */#  if defined(TRIO_PLATFORM_UNIX)    void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN);#  endif    pinf_value = HUGE_VAL;    if (HUGE_VAL == DBL_MAX) {      /* Force overflow */      pinf_value += HUGE_VAL;    }    #  if defined(TRIO_PLATFORM_UNIX)    signal(SIGFPE, signal_handler);#  endif# endif  }  return pinf_value;}#endif/**   Generate negative infinity.   @return Floating-point value of negative infinity.*/#if defined(TRIO_FUNC_NINF)TRIO_PUBLIC_NAN doubletrio_ninf(TRIO_NOARGS){  static double ninf_value = 0.0;  if (ninf_value == 0.0) {    /*     * Negative infinity is calculated by negating positive infinity,     * which can be done because it is legal to do calculations on     * infinity (for example,  1 / infinity == 0).     */    ninf_value = -trio_pinf();  }  return ninf_value;}#endif/**   Generate NaN.   @return Floating-point representation of NaN.*/#if defined(TRIO_FUNC_NAN)TRIO_PUBLIC_NAN doubletrio_nan(TRIO_NOARGS){  /* Cache the result */  static double nan_value = 0.0;  if (nan_value == 0.0) {    # if defined(TRIO_NAN_C99_FUNCTION) || defined(TRIO_PLATFORM_SYMBIAN)        nan_value = nan("");# endif    # if defined(TRIO_NAN_C99_MACRO)        nan_value = (double)NAN;# endif# if defined(TRIO_NAN_IEEE_754)        nan_value = internal_make_double(ieee_754_qnan_array);# endif    # if defined(TRIO_NAN_FALLBACK)    /*     * There are several ways to generate NaN. The one used here is     * to divide infinity by infinity. I would have preferred to add     * negative infinity to positive infinity, but that yields wrong     * result (infinity) on FreeBSD.     *     * This may fail if the hardware does not support NaN, or if     * the Invalid Operation floating-point exception is unmasked.     */#  if defined(TRIO_PLATFORM_UNIX)    void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN);#  endif        nan_value = trio_pinf() / trio_pinf();    #  if defined(TRIO_PLATFORM_UNIX)    signal(SIGFPE, signal_handler);#  endif# endif  }  return nan_value;}#endif/** @} SpecialQuantities *//************************************************************************* * For test purposes. * * Add the following compiler option to include this test code. * *  Unix : -DSTANDALONE *  VMS  : /DEFINE=(STANDALONE) */#if defined(STANDALONE)# include <stdio.h>static TRIO_CONST char *getClassificationTRIO_ARGS1((type),	   int type){  switch (type) {  case TRIO_FP_INFINITE:    return "FP_INFINITE";  case TRIO_FP_NAN:    return "FP_NAN";  case TRIO_FP_NORMAL:    return "FP_NORMAL";  case TRIO_FP_SUBNORMAL:    return "FP_SUBNORMAL";  case TRIO_FP_ZERO:    return "FP_ZERO";  default:    return "FP_UNKNOWN";  }}static voidprint_classTRIO_ARGS2((prefix, number),	   TRIO_CONST char *prefix,	   double number){  printf("%-6s: %s %-15s %g\n",	 prefix,	 trio_signbit(number) ? "-" : "+",	 getClassification(trio_fpclassify(number)),	 number);}int main(TRIO_NOARGS){  double my_nan;  double my_pinf;  double my_ninf;# if defined(TRIO_PLATFORM_UNIX)  void (*signal_handler) TRIO_PROTO((int));# endif  my_nan = trio_nan();  my_pinf = trio_pinf();  my_ninf = trio_ninf();  print_class("Nan", my_nan);  print_class("PInf", my_pinf);  print_class("NInf", my_ninf);  print_class("PZero", 0.0);  print_class("NZero", -0.0);  print_class("PNorm", 1.0);  print_class("NNorm", -1.0);  print_class("PSub", 1.01e-307 - 1.00e-307);  print_class("NSub", 1.00e-307 - 1.01e-307);    printf("NaN : %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\n",	 my_nan,	 ((unsigned char *)&my_nan)[0],	 ((unsigned char *)&my_nan)[1],	 ((unsigned char *)&my_nan)[2],	 ((unsigned char *)&my_nan)[3],	 ((unsigned char *)&my_nan)[4],	 ((unsigned char *)&my_nan)[5],	 ((unsigned char *)&my_nan)[6],	 ((unsigned char *)&my_nan)[7],	 trio_isnan(my_nan), trio_isinf(my_nan), trio_isfinite(my_nan));  printf("PInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\n",	 my_pinf,	 ((unsigned char *)&my_pinf)[0],	 ((unsigned char *)&my_pinf)[1],	 ((unsigned char *)&my_pinf)[2],	 ((unsigned char *)&my_pinf)[3],	 ((unsigned char *)&my_pinf)[4],	 ((unsigned char *)&my_pinf)[5],	 ((unsigned char *)&my_pinf)[6],	 ((unsigned char *)&my_pinf)[7],	 trio_isnan(my_pinf), trio_isinf(my_pinf), trio_isfinite(my_pinf));  printf("NInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\n",	 my_ninf,	 ((unsigned char *)&my_ninf)[0],	 ((unsigned char *)&my_ninf)[1],	 ((unsigned char *)&my_ninf)[2],	 ((unsigned char *)&my_ninf)[3],	 ((unsigned char *)&my_ninf)[4],	 ((unsigned char *)&my_ninf)[5],	 ((unsigned char *)&my_ninf)[6],	 ((unsigned char *)&my_ninf)[7],	 trio_isnan(my_ninf), trio_isinf(my_ninf), trio_isfinite(my_ninf));  # if defined(TRIO_PLATFORM_UNIX)  signal_handler = signal(SIGFPE, SIG_IGN);# endif    my_pinf = DBL_MAX + DBL_MAX;  my_ninf = -my_pinf;  my_nan = my_pinf / my_pinf;# if defined(TRIO_PLATFORM_UNIX)  signal(SIGFPE, signal_handler);# endif    printf("NaN : %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\n",	 my_nan,	 ((unsigned char *)&my_nan)[0],	 ((unsigned char *)&my_nan)[1],	 ((unsigned char *)&my_nan)[2],	 ((unsigned char *)&my_nan)[3],	 ((unsigned char *)&my_nan)[4],	 ((unsigned char *)&my_nan)[5],	 ((unsigned char *)&my_nan)[6],	 ((unsigned char *)&my_nan)[7],	 trio_isnan(my_nan), trio_isinf(my_nan), trio_isfinite(my_nan));  printf("PInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\n",	 my_pinf,	 ((unsigned char *)&my_pinf)[0],	 ((unsigned char *)&my_pinf)[1],	 ((unsigned char *)&my_pinf)[2],	 ((unsigned char *)&my_pinf)[3],	 ((unsigned char *)&my_pinf)[4],	 ((unsigned char *)&my_pinf)[5],	 ((unsigned char *)&my_pinf)[6],	 ((unsigned char *)&my_pinf)[7],	 trio_isnan(my_pinf), trio_isinf(my_pinf), trio_isfinite(my_pinf));  printf("NInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\n",	 my_ninf,	 ((unsigned char *)&my_ninf)[0],	 ((unsigned char *)&my_ninf)[1],	 ((unsigned char *)&my_ninf)[2],	 ((unsigned char *)&my_ninf)[3],	 ((unsigned char *)&my_ninf)[4],	 ((unsigned char *)&my_ninf)[5],	 ((unsigned char *)&my_ninf)[6],	 ((unsigned char *)&my_ninf)[7],	 trio_isnan(my_ninf), trio_isinf(my_ninf), trio_isfinite(my_ninf));    return 0;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -