int main (int argc, char *argv[]) { mpfr_t x, y; unsigned int n; tests_start_mpfr (); test_generic (2, 100, 20); mpfr_init2 (x, 53); mpfr_init2 (y, 53); /* check NaN */ mpfr_set_nan (x); mpfr_log10 (y, x, GMP_RNDN); MPFR_ASSERTN(mpfr_nan_p (y)); /* check Inf */ mpfr_set_inf (x, -1); mpfr_log10 (y, x, GMP_RNDN); MPFR_ASSERTN(mpfr_nan_p (y)); mpfr_set_inf (x, 1); mpfr_log10 (y, x, GMP_RNDN); MPFR_ASSERTN(mpfr_inf_p (y) && mpfr_sgn (y) > 0); /* check negative argument */ mpfr_set_si (x, -1, GMP_RNDN); mpfr_log10 (y, x, GMP_RNDN); MPFR_ASSERTN(mpfr_nan_p (y)); /* check log10(1) = 0 */ mpfr_set_ui (x, 1, GMP_RNDN); mpfr_log10 (y, x, GMP_RNDN); MPFR_ASSERTN((mpfr_cmp_ui (y, 0) == 0) && (MPFR_IS_POS (y))); /* check log10(10^n)=n */ mpfr_set_ui (x, 1, GMP_RNDN); for (n = 1; n <= 15; n++) { mpfr_mul_ui (x, x, 10, GMP_RNDN); /* x = 10^n */ mpfr_log10 (y, x, GMP_RNDN); if (mpfr_cmp_ui (y, n) ) { printf ("log10(10^n) <> n for n=%u\n", n); exit (1); } } mpfr_clear (x); mpfr_clear (y); tests_end_mpfr (); return 0; }
static int test_log10 (mpfr_ptr a, mpfr_srcptr b, mpfr_rnd_t rnd_mode) { int res; int ok = rnd_mode == MPFR_RNDN && mpfr_number_p (b) && mpfr_get_prec (a)>=53; if (ok) { mpfr_print_raw (b); } res = mpfr_log10 (a, b, rnd_mode); if (ok) { printf (" "); mpfr_print_raw (a); printf ("\n"); } return res; }
//------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ knumber_base *knumber_float::log10() { #ifdef KNUMBER_USE_MPFR mpfr_t mpfr; mpfr_init_set_f(mpfr, mpf_, rounding_mode); mpfr_log10(mpfr, mpfr, rounding_mode); mpfr_get_f(mpf_, mpfr, rounding_mode); mpfr_clear(mpfr); return this; #else const double x = mpf_get_d(mpf_); if(isinf(x)) { delete this; return new knumber_error(knumber_error::ERROR_POS_INFINITY); } else { return execute_libc_func< ::log10>(x); } #endif }
MpfrFloat MpfrFloat::log10(const MpfrFloat& value) { MpfrFloat retval(MpfrFloat::kNoInitialization); mpfr_log10(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN); return retval; }
int main(){ double max; double tmp; double resDet; mpfr_t det; double mulTmp; mpfr_t tmp1; mpfr_t tmp2; mpfr_t logAbsDet; int i,j,k,maxRow,sign; char f_name[50]; double* buffer; mpfr_init(det); mpfr_init(tmp1); mpfr_init(tmp2); mpfr_init(logAbsDet); buffer = malloc(size*size*sizeof(double)); sprintf(f_name,"m5000x5000.bin"); FILE *datafile=fopen(f_name,"rb"); for(i=0;i<size;i++){ for(j=0;j<size;j++){ *(buffer+size*i+j)=0; } } for(i=0;i<size;i++){ for(j=0;j<size;j++){ fread(buffer+(size*i+j),sizeof(double),1,datafile); } } for(i=0;i<size;i++){ for(j=0;j<size;j++){ printf("%lf\t",*(buffer+(size*i+j))); } printf("\n"); } for(i=0;i<size-1;i++){ maxRow = i; max = *(buffer+(size*i+i)); for(j=i+1;j<size;j++){ if(fabs(max)<fabs(*(buffer+size*j+i))){ max = *(buffer+size*j+i); maxRow=j; } } if(fabs(max)<0.000001){ resDet =0; printf("det=%e\n",resDet); exit(1); } if(maxRow!=i){ sign++; for(j=i;j<size;j++){ tmp = *(buffer + size*i+j); *(buffer+size*i+j) = *(buffer + size*maxRow+j); *(buffer+size*maxRow+j) = tmp; } } for(j=i+1;j<size;j++){ mulTmp = *(buffer+size*j+i) / *(buffer+size*i+i); for(k=i;k<size;k++){ *(buffer+size*j+k) = *(buffer+size*j+k)-*(buffer + size*i+k)*mulTmp; } } } mpfr_set_d(tmp1,1.0,GMP_RNDN); for(i=0;i<size;i++){ mpfr_set_d(tmp2,*(buffer+size*i+i),GMP_RNDN); mpfr_mul(tmp1,tmp2,tmp1,GMP_RNDN); } if(sign%2==0){ mpfr_set(det,tmp1,GMP_RNDN); resDet=mpfr_get_d(det,GMP_RNDN); mpfr_log10(logAbsDet,det,GMP_RNDN); } else{ mpfr_neg(tmp1,tmp1,GMP_RNDN); mpfr_set(det,tmp1,GMP_RNDN); resDet=mpfr_get_d(det,GMP_RNDN); mpfr_log10(logAbsDet,det,GMP_RNDN); } //mpf_abs(absDet,det); // mpf_set(logAbsDet, mpfr_log10(absDet)); // mpfr_printf("det= %Fe\n",det); printf("det= %e\n",resDet); mpfr_printf("log(abs(det))= %Fe\n",logAbsDet); //gmp_printf("log(abs(det)= %e\n",logAbsDet); double END = clock(); printf("%f\n",END/CLOCKS_PER_SEC); mpfr_clear(det); mpfr_clear(tmp1); mpfr_clear(tmp2); mpfr_clear(logAbsDet); free(buffer); return 0; }