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 } \