Mercurial > octave
comparison liboctave/MArray-defs.h @ 7789:82be108cc558
First attempt at single precision tyeps
* * *
corrections to qrupdate single precision routines
* * *
prefer demotion to single over promotion to double
* * *
Add single precision support to log2 function
* * *
Trivial PROJECT file update
* * *
Cache optimized hermitian/transpose methods
* * *
Add tests for tranpose/hermitian and ChangeLog entry for new transpose code
author | David Bateman <dbateman@free.fr> |
---|---|
date | Sun, 27 Apr 2008 22:34:17 +0200 |
parents | 2c5b14c60c6c |
children | b11c31849b44 |
comparison
equal
deleted
inserted
replaced
7788:45f5faba05a2 | 7789:82be108cc558 |
---|---|
341 (R, T, , T, dynamic_cast<const B<T>&>, R) \ | 341 (R, T, , T, dynamic_cast<const B<T>&>, R) \ |
342 \ | 342 \ |
343 MDIAGARRAY2_DADA_BINOP_FWD_DEFS \ | 343 MDIAGARRAY2_DADA_BINOP_FWD_DEFS \ |
344 (R, T, dynamic_cast<const B<T>&>, R, dynamic_cast<const B<T>&>, R) | 344 (R, T, dynamic_cast<const B<T>&>, R, dynamic_cast<const B<T>&>, R) |
345 | 345 |
346 #define MARRAY_NORM_BODY(TYPE, blas_norm, BLAS_NORM) \ | 346 #define MARRAY_NORM_BODY(TYPE, RTYPE, blas_norm, BLAS_NORM, NAN_VALUE) \ |
347 \ | 347 \ |
348 double retval = octave_NaN; \ | 348 RTYPE retval = NAN_VALUE; \ |
349 \ | 349 \ |
350 octave_idx_type len = length (); \ | 350 octave_idx_type len = length (); \ |
351 \ | 351 \ |
352 if (len > 0) \ | 352 if (len > 0) \ |
353 { \ | 353 { \ |
357 { \ | 357 { \ |
358 /* Frobenius norm. */ \ | 358 /* Frobenius norm. */ \ |
359 retval = 0; \ | 359 retval = 0; \ |
360 \ | 360 \ |
361 /* precondition */ \ | 361 /* precondition */ \ |
362 double inf_norm = 0.; \ | 362 RTYPE inf_norm = 0.; \ |
363 for (octave_idx_type i = 0; i < len; i++) \ | 363 for (octave_idx_type i = 0; i < len; i++) \ |
364 { \ | 364 { \ |
365 double d_abs = std::abs (d[i]); \ | 365 RTYPE d_abs = std::abs (d[i]); \ |
366 if (d_abs > inf_norm) \ | 366 if (d_abs > inf_norm) \ |
367 inf_norm = d_abs; \ | 367 inf_norm = d_abs; \ |
368 } \ | 368 } \ |
369 inf_norm = (inf_norm == octave_Inf || inf_norm == 0. ? 1.0 : \ | 369 inf_norm = (inf_norm == octave_Inf || inf_norm == 0. ? 1.0 : \ |
370 inf_norm); \ | 370 inf_norm); \ |
371 double scale = 1. / inf_norm; \ | 371 RTYPE scale = 1. / inf_norm; \ |
372 \ | 372 \ |
373 for (octave_idx_type i = 0; i < len; i++) \ | 373 for (octave_idx_type i = 0; i < len; i++) \ |
374 { \ | 374 { \ |
375 double d_abs = std::abs (d[i]) * scale; \ | 375 RTYPE d_abs = std::abs (d[i]) * scale; \ |
376 retval += d_abs * d_abs; \ | 376 retval += d_abs * d_abs; \ |
377 } \ | 377 } \ |
378 \ | 378 \ |
379 retval = ::sqrt (retval) * inf_norm; \ | 379 retval = ::sqrt (retval) * inf_norm; \ |
380 } \ | 380 } \ |
392 \ | 392 \ |
393 if (p > 0) \ | 393 if (p > 0) \ |
394 { \ | 394 { \ |
395 while (i < len) \ | 395 while (i < len) \ |
396 { \ | 396 { \ |
397 double d_abs = std::abs (d[i++]); \ | 397 RTYPE d_abs = std::abs (d[i++]); \ |
398 \ | 398 \ |
399 if (d_abs > retval) \ | 399 if (d_abs > retval) \ |
400 retval = d_abs; \ | 400 retval = d_abs; \ |
401 } \ | 401 } \ |
402 } \ | 402 } \ |
403 else \ | 403 else \ |
404 { \ | 404 { \ |
405 while (i < len) \ | 405 while (i < len) \ |
406 { \ | 406 { \ |
407 double d_abs = std::abs (d[i++]); \ | 407 RTYPE d_abs = std::abs (d[i++]); \ |
408 \ | 408 \ |
409 if (d_abs < retval) \ | 409 if (d_abs < retval) \ |
410 retval = d_abs; \ | 410 retval = d_abs; \ |
411 } \ | 411 } \ |
412 } \ | 412 } \ |
415 { \ | 415 { \ |
416 retval = 0; \ | 416 retval = 0; \ |
417 \ | 417 \ |
418 for (octave_idx_type i = 0; i < len; i++) \ | 418 for (octave_idx_type i = 0; i < len; i++) \ |
419 { \ | 419 { \ |
420 double d_abs = std::abs (d[i]); \ | 420 RTYPE d_abs = std::abs (d[i]); \ |
421 retval += pow (d_abs, p); \ | 421 retval += pow (d_abs, p); \ |
422 } \ | 422 } \ |
423 \ | 423 \ |
424 retval = pow (retval, 1/p); \ | 424 retval = pow (retval, 1/p); \ |
425 } \ | 425 } \ |