3426
3427
3428
3429
3430
3431
3432
3433 INTEGER INCX, N
3434 REAL ERRBND, PREC, USCLR
3435
3436
3437 COMPLEX X( * )
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489 REAL ONE, TWO, ZERO
3490 parameter( one = 1.0e+0, two = 2.0e+0,
3491 $ zero = 0.0e+0 )
3492
3493
3494 INTEGER IX
3495 REAL ABSXI, ADDBND, FACT, SCALE, SSQ, SUMSCA, SUMSSQ
3496
3497
3498 INTRINSIC abs, aimag, real
3499
3500
3501
3502 usclr = zero
3503 sumssq = one
3504 sumsca = zero
3505 addbnd = two * two * two * prec
3506 fact = one + two * ( ( one + prec )**3 - one )
3507
3508 scale = zero
3509 ssq = one
3510 DO 10 ix = 1, 1 + ( n - 1 )*incx, incx
3511 IF( real( x( ix ) ).NE.zero ) THEN
3512 absxi = abs( real( x( ix ) ) )
3513 IF( scale.LT.absxi )THEN
3514 sumssq = one + ( ssq*( scale/absxi )**2 ) * fact
3515 errbnd = addbnd * sumssq
3516 sumssq = sumssq + errbnd
3517 ssq = one + ssq*( scale/absxi )**2
3518 sumsca = absxi
3519 scale = absxi
3520 ELSE
3521 sumssq = ssq + ( ( absxi/scale )**2 ) * fact
3522 errbnd = addbnd * sumssq
3523 sumssq = sumssq + errbnd
3524 ssq = ssq + ( absxi/scale )**2
3525 END IF
3526 END IF
3527 IF( aimag( x( ix ) ).NE.zero ) THEN
3528 absxi = abs( aimag( x( ix ) ) )
3529 IF( scale.LT.absxi )THEN
3530 sumssq = one + ( ssq*( scale/absxi )**2 ) * fact
3531 errbnd = addbnd * sumssq
3532 sumssq = sumssq + errbnd
3533 ssq = one + ssq*( scale/absxi )**2
3534 sumsca = absxi
3535 scale = absxi
3536 ELSE
3537 sumssq = ssq + ( ( absxi/scale )**2 ) * fact
3538 errbnd = addbnd * sumssq
3539 sumssq = sumssq + errbnd
3540 ssq = ssq + ( absxi/scale )**2
3541 END IF
3542 END IF
3543 10 CONTINUE
3544
3545 usclr = scale * sqrt( ssq )
3546
3547
3548
3549 errbnd = sqrt( sumssq ) * ( one + two * ( 1.00001e+0 * prec ) )
3550
3551 errbnd = ( sumsca * errbnd ) - usclr
3552
3553 RETURN
3554
3555
3556