3281
3282
3283
3284
3285
3286
3287
3288 INTEGER INCX, INCY, N
3289 DOUBLE PRECISION ERRBND, PREC
3290 COMPLEX*16 SCLR
3291
3292
3293 COMPLEX*16 X( * ), Y( * )
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355 DOUBLE PRECISION ONE, TWO, ZERO
3356 parameter( one = 1.0d+0, two = 2.0d+0,
3357 $ zero = 0.0d+0 )
3358
3359
3360 INTEGER I, IX, IY
3361 DOUBLE PRECISION ADDBND, FACT, SUMINEG, SUMIPOS, SUMRNEG,
3362 $ SUMRPOS, TMP
3363
3364
3365 INTRINSIC abs, dble, dconjg, dimag,
max
3366
3367
3368
3369 ix = 1
3370 iy = 1
3371 sclr = zero
3372 sumipos = zero
3373 sumineg = zero
3374 sumrpos = zero
3375 sumrneg = zero
3376 fact = two * ( one + prec )
3377 addbnd = two * two * two * prec
3378
3379 DO 10 i = 1, n
3380
3381 sclr = sclr + dconjg( x( ix ) ) * y( iy )
3382
3383 tmp = dble( x( ix ) ) * dble( y( iy ) )
3384 IF( tmp.GE.zero ) THEN
3385 sumrpos = sumrpos + tmp * fact
3386 ELSE
3387 sumrneg = sumrneg - tmp * fact
3388 END IF
3389
3390 tmp = dimag( x( ix ) ) * dimag( y( iy ) )
3391 IF( tmp.GE.zero ) THEN
3392 sumrpos = sumrpos + tmp * fact
3393 ELSE
3394 sumrneg = sumrneg - tmp * fact
3395 END IF
3396
3397 tmp = - dimag( x( ix ) ) * dble( y( iy ) )
3398 IF( tmp.GE.zero ) THEN
3399 sumipos = sumipos + tmp * fact
3400 ELSE
3401 sumineg = sumineg - tmp * fact
3402 END IF
3403
3404 tmp = dble( x( ix ) ) * dimag( y( iy ) )
3405 IF( tmp.GE.zero ) THEN
3406 sumipos = sumipos + tmp * fact
3407 ELSE
3408 sumineg = sumineg - tmp * fact
3409 END IF
3410
3411 ix = ix + incx
3412 iy = iy + incy
3413
3414 10 CONTINUE
3415
3416 errbnd = addbnd *
max(
max( sumrpos, sumrneg ),
3417 $
max( sumipos, sumineg ) )
3418
3419 RETURN
3420
3421
3422