number 0.9.7 → 0.9.9
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/{bounds.c → number/bounds.c} +0 -0
- data/ext/{compare.c → number/compare.c} +1 -1
- data/ext/{complex.c → number/complex.c} +78 -74
- data/ext/number/decompose.c +231 -0
- data/ext/{extconf.rb → number/extconf.rb} +0 -0
- data/ext/{interval.c → number/interval.c} +60 -62
- data/ext/{number.c → number/number.c} +95 -92
- data/ext/{number.h → number/number.h} +302 -0
- data/ext/{real.c → number/real.c} +9 -9
- data/ext/{real_bounds.c → number/real_bounds.c} +2 -2
- data/ext/number/round.c +46 -0
- metadata +15 -16
- data/ext/decompose.c +0 -231
- data/ext/round.c +0 -46
File without changes
|
@@ -657,7 +657,7 @@ int complex_contain_zero_p (Complex* complex)
|
|
657
657
|
|
658
658
|
int complex_intersect_p (Complex* a, Complex* b)
|
659
659
|
{
|
660
|
-
return (complex_re_intersect_p(a, b) && complex_im_intersect_p(a, b)) || complex_contain_ll_p(a, b) || complex_contain_lu_p(a, b) || complex_contain_ul_p(a, b) || complex_contain_uu_p(a, b) || (complex_re_enclose_p(a, b) && complex_im_enclose_p(b, a) || (complex_im_enclose_p(a, b) && complex_re_enclose_p(b, a)));
|
660
|
+
return ( complex_re_intersect_p(a, b) && complex_im_intersect_p(a, b)) || complex_contain_ll_p(a, b) || complex_contain_lu_p(a, b) || complex_contain_ul_p(a, b) || complex_contain_uu_p(a, b) || ((complex_re_enclose_p(a, b) && complex_im_enclose_p(b, a)) || (complex_im_enclose_p(a, b) && complex_re_enclose_p(b, a)));
|
661
661
|
}
|
662
662
|
|
663
663
|
int complex_disjoint_p (Complex* a, Complex* b)
|
@@ -111,7 +111,6 @@ void mpc_set_r_r (mpc_t num, Real* re, Real* im)
|
|
111
111
|
*/
|
112
112
|
void mpfr_set_r (mpfr_t num, Real* real)
|
113
113
|
{
|
114
|
-
char sign;
|
115
114
|
char buf[10000];
|
116
115
|
char real_buf[10000];
|
117
116
|
|
@@ -155,7 +154,7 @@ void complex_free (Complex* complex)
|
|
155
154
|
*/
|
156
155
|
long complex_strlen (Complex* complex)
|
157
156
|
{
|
158
|
-
return interval_strlen(complex->re) + interval_strlen(complex->im) + 10;
|
157
|
+
return (interval_strlen(complex->re) + interval_strlen(complex->im) + 10);
|
159
158
|
}
|
160
159
|
|
161
160
|
/*
|
@@ -189,7 +188,7 @@ void complex_print (char* buf, Complex* complex)
|
|
189
188
|
void complex_print_int (char* buf, Complex* complex)
|
190
189
|
{
|
191
190
|
Real* rounded;
|
192
|
-
rounded =
|
191
|
+
rounded = real_round_origin(complex->re->n);
|
193
192
|
|
194
193
|
if (!REAL(rounded))
|
195
194
|
{
|
@@ -238,7 +237,7 @@ void complex_print_decimal (char* buf, Complex* complex)
|
|
238
237
|
Complex* complex_new (Interval* re, Interval* im)
|
239
238
|
{
|
240
239
|
Complex* complex;
|
241
|
-
complex =
|
240
|
+
complex = malloc(sizeof(Complex));
|
242
241
|
|
243
242
|
if (complex == NULL)
|
244
243
|
{
|
@@ -246,8 +245,8 @@ Complex* complex_new (Interval* re, Interval* im)
|
|
246
245
|
}
|
247
246
|
|
248
247
|
memset(complex, 0, sizeof(Complex));
|
249
|
-
complex->re =
|
250
|
-
complex->im =
|
248
|
+
complex->re = re;
|
249
|
+
complex->im = im;
|
251
250
|
|
252
251
|
return complex;
|
253
252
|
}
|
@@ -259,7 +258,13 @@ Complex* complex_new (Interval* re, Interval* im)
|
|
259
258
|
*/
|
260
259
|
Complex* complex_from_real (Real* real)
|
261
260
|
{
|
262
|
-
|
261
|
+
Interval* re;
|
262
|
+
Interval* im;
|
263
|
+
|
264
|
+
re = interval_from_real(real);
|
265
|
+
im = interval_zero();
|
266
|
+
|
267
|
+
return complex_new(re, im);
|
263
268
|
}
|
264
269
|
|
265
270
|
/*
|
@@ -271,8 +276,8 @@ Complex* complex_from_int_str (char* buf)
|
|
271
276
|
Real* real;
|
272
277
|
Complex* result;
|
273
278
|
|
274
|
-
real =
|
275
|
-
result =
|
279
|
+
real = real_from_str(buf, strlen(buf) - (*buf == '-'));
|
280
|
+
result = complex_from_real(real);
|
276
281
|
|
277
282
|
real_free(real);
|
278
283
|
|
@@ -290,8 +295,8 @@ Complex* complex_from_float_str (char* buf)
|
|
290
295
|
|
291
296
|
mpfr_set_str(tmp_complex_from_float_str, buf, 10, MPFR_RNDN);
|
292
297
|
|
293
|
-
real =
|
294
|
-
result =
|
298
|
+
real = real_from_mpfr(tmp_complex_from_float_str, ROUND_NEAREST);
|
299
|
+
result = complex_from_real(real);
|
295
300
|
|
296
301
|
real_free(real);
|
297
302
|
|
@@ -303,7 +308,7 @@ Complex* complex_from_float_str (char* buf)
|
|
303
308
|
*/
|
304
309
|
Complex* complex_nan ()
|
305
310
|
{
|
306
|
-
return complex_new(
|
311
|
+
return complex_new(interval_nan(), interval_zero());
|
307
312
|
}
|
308
313
|
|
309
314
|
/*
|
@@ -311,7 +316,7 @@ Complex* complex_nan ()
|
|
311
316
|
*/
|
312
317
|
Complex* complex_pos_inf ()
|
313
318
|
{
|
314
|
-
return complex_new(
|
319
|
+
return complex_new(interval_pos_inf(), interval_zero());
|
315
320
|
}
|
316
321
|
|
317
322
|
/*
|
@@ -319,7 +324,7 @@ Complex* complex_pos_inf ()
|
|
319
324
|
*/
|
320
325
|
Complex* complex_neg_inf ()
|
321
326
|
{
|
322
|
-
return complex_new(
|
327
|
+
return complex_new(interval_neg_inf(), interval_zero());
|
323
328
|
}
|
324
329
|
|
325
330
|
/*
|
@@ -327,7 +332,7 @@ Complex* complex_neg_inf ()
|
|
327
332
|
*/
|
328
333
|
Complex* complex_zero ()
|
329
334
|
{
|
330
|
-
return complex_new(
|
335
|
+
return complex_new(interval_zero(), interval_zero());
|
331
336
|
}
|
332
337
|
|
333
338
|
/*
|
@@ -335,7 +340,7 @@ Complex* complex_zero ()
|
|
335
340
|
*/
|
336
341
|
Complex* complex_one ()
|
337
342
|
{
|
338
|
-
return complex_new(
|
343
|
+
return complex_new(interval_one(), interval_zero());
|
339
344
|
}
|
340
345
|
|
341
346
|
/*
|
@@ -344,7 +349,7 @@ Complex* complex_one ()
|
|
344
349
|
*/
|
345
350
|
Complex* complex_pi ()
|
346
351
|
{
|
347
|
-
return complex_new(
|
352
|
+
return complex_new(interval_pi(), interval_zero());
|
348
353
|
}
|
349
354
|
|
350
355
|
/*
|
@@ -353,7 +358,7 @@ Complex* complex_pi ()
|
|
353
358
|
*/
|
354
359
|
Complex* complex_e ()
|
355
360
|
{
|
356
|
-
return complex_new(
|
361
|
+
return complex_new(interval_e(), interval_zero());
|
357
362
|
}
|
358
363
|
|
359
364
|
/*
|
@@ -361,7 +366,7 @@ Complex* complex_e ()
|
|
361
366
|
*/
|
362
367
|
Complex* complex_i ()
|
363
368
|
{
|
364
|
-
return complex_new(
|
369
|
+
return complex_new(interval_zero(), interval_one());
|
365
370
|
}
|
366
371
|
|
367
372
|
/*
|
@@ -370,7 +375,7 @@ Complex* complex_i ()
|
|
370
375
|
*/
|
371
376
|
Complex* complex_dup (Complex* complex)
|
372
377
|
{
|
373
|
-
return complex_new(
|
378
|
+
return complex_new(interval_dup(complex->re), interval_dup(complex->im));
|
374
379
|
}
|
375
380
|
|
376
381
|
/*
|
@@ -381,8 +386,8 @@ Complex* complex_add (Complex* a, Complex* b)
|
|
381
386
|
Interval* re;
|
382
387
|
Interval* im;
|
383
388
|
|
384
|
-
re =
|
385
|
-
im =
|
389
|
+
re = interval_add(a->re, b->re);
|
390
|
+
im = interval_add(a->im, b->im);
|
386
391
|
|
387
392
|
return complex_new(re, im);
|
388
393
|
}
|
@@ -395,8 +400,8 @@ Complex* complex_subtract (Complex* a, Complex* b)
|
|
395
400
|
Interval* re;
|
396
401
|
Interval* im;
|
397
402
|
|
398
|
-
re =
|
399
|
-
im =
|
403
|
+
re = interval_subtract(a->re, b->re);
|
404
|
+
im = interval_subtract(a->im, b->im);
|
400
405
|
|
401
406
|
return complex_new(re, im);
|
402
407
|
}
|
@@ -413,20 +418,20 @@ Complex* complex_multiply (Complex* a, Complex* b)
|
|
413
418
|
Interval* re;
|
414
419
|
Interval* im;
|
415
420
|
|
416
|
-
re_re =
|
417
|
-
re_im =
|
418
|
-
im_re =
|
419
|
-
im_im =
|
421
|
+
re_re = interval_multiply(a->re, b->re);
|
422
|
+
re_im = interval_multiply(a->re, b->im);
|
423
|
+
im_re = interval_multiply(a->im, b->re);
|
424
|
+
im_im = interval_multiply(a->im, b->im);
|
420
425
|
|
421
|
-
re =
|
422
|
-
im =
|
426
|
+
re = interval_subtract(re_re, im_im);
|
427
|
+
im = interval_add(re_im, im_re);
|
423
428
|
|
424
429
|
interval_free(re_re);
|
425
430
|
interval_free(re_im);
|
426
431
|
interval_free(im_re);
|
427
432
|
interval_free(im_im);
|
428
433
|
|
429
|
-
return
|
434
|
+
return complex_new(re, im);
|
430
435
|
}
|
431
436
|
|
432
437
|
/*
|
@@ -446,9 +451,9 @@ Complex* complex_divide (Complex* a, Complex* b)
|
|
446
451
|
Interval* re;
|
447
452
|
Interval* im;
|
448
453
|
|
449
|
-
denominator_re =
|
450
|
-
denominator_im =
|
451
|
-
denominator =
|
454
|
+
denominator_re = interval_multiply(b->re, b->re);
|
455
|
+
denominator_im = interval_multiply(b->im, b->im);
|
456
|
+
denominator = interval_add(denominator_re, denominator_im);
|
452
457
|
|
453
458
|
if (real_zero_p(denominator->l) || real_zero_p(denominator->u) || interval_span_zero_p(denominator))
|
454
459
|
{
|
@@ -466,21 +471,21 @@ Complex* complex_divide (Complex* a, Complex* b)
|
|
466
471
|
mpc_real(tmp_divide_re, tmp_divide_quotient, MPFR_RNDN);
|
467
472
|
mpc_imag(tmp_divide_im, tmp_divide_quotient, MPFR_RNDN);
|
468
473
|
|
469
|
-
re =
|
470
|
-
im =
|
474
|
+
re = interval_new(real_neg_inf(), true, real_from_mpfr(tmp_divide_re, ROUND_NEAREST), true, real_pos_inf());
|
475
|
+
im = interval_new(real_neg_inf(), true, real_from_mpfr(tmp_divide_im, ROUND_NEAREST), true, real_pos_inf());
|
471
476
|
}
|
472
477
|
else
|
473
478
|
{
|
474
|
-
re_re =
|
475
|
-
re_im =
|
476
|
-
im_re =
|
477
|
-
im_im =
|
479
|
+
re_re = interval_multiply(a->re, b->re);
|
480
|
+
re_im = interval_multiply(a->re, b->im);
|
481
|
+
im_re = interval_multiply(a->im, b->re);
|
482
|
+
im_im = interval_multiply(a->im, b->im);
|
478
483
|
|
479
|
-
numerator_re =
|
480
|
-
numerator_im =
|
484
|
+
numerator_re = interval_add(re_re, im_im);
|
485
|
+
numerator_im = interval_subtract(im_re, re_im);
|
481
486
|
|
482
|
-
re =
|
483
|
-
im =
|
487
|
+
re = interval_divide(numerator_re, denominator);
|
488
|
+
im = interval_divide(numerator_im, denominator);
|
484
489
|
|
485
490
|
interval_free(re_re);
|
486
491
|
interval_free(re_im);
|
@@ -494,7 +499,7 @@ Complex* complex_divide (Complex* a, Complex* b)
|
|
494
499
|
interval_free(denominator_im);
|
495
500
|
interval_free(denominator);
|
496
501
|
|
497
|
-
return
|
502
|
+
return complex_new(re, im);
|
498
503
|
}
|
499
504
|
|
500
505
|
/*
|
@@ -505,10 +510,10 @@ Complex* complex_modulo (Complex* a, Complex* b)
|
|
505
510
|
Interval* re;
|
506
511
|
Interval* im;
|
507
512
|
|
508
|
-
re =
|
509
|
-
im =
|
513
|
+
re = interval_zero();
|
514
|
+
im = interval_zero();
|
510
515
|
|
511
|
-
return
|
516
|
+
return complex_new(re, im);
|
512
517
|
}
|
513
518
|
|
514
519
|
/*
|
@@ -553,7 +558,7 @@ Complex* complex_abs (Complex* complex)
|
|
553
558
|
ul_mpc_ternary = mpc_abs(tmp_abs_ul_re, tmp_abs_ul, MPC_RNDUD);
|
554
559
|
uu_mpc_ternary = mpc_abs(tmp_abs_uu_re, tmp_abs_uu, MPC_RNDUU);
|
555
560
|
|
556
|
-
bounds =
|
561
|
+
bounds = bounds_new();
|
557
562
|
bounds_update_re(bounds, tmp_abs_ll_re, complex->re->L, MPC_INEX_RE(ll_mpc_ternary) == 0);
|
558
563
|
bounds_update_re(bounds, tmp_abs_lu_re, complex->re->L, MPC_INEX_RE(lu_mpc_ternary) == 0);
|
559
564
|
bounds_update_re(bounds, tmp_abs_ul_re, complex->re->R, MPC_INEX_RE(ul_mpc_ternary) == 0);
|
@@ -561,8 +566,8 @@ Complex* complex_abs (Complex* complex)
|
|
561
566
|
|
562
567
|
if (interval_span_zero_p(complex->im))
|
563
568
|
{
|
564
|
-
l_abs =
|
565
|
-
u_abs =
|
569
|
+
l_abs = real_abs(complex->re->l);
|
570
|
+
u_abs = real_abs(complex->re->u);
|
566
571
|
|
567
572
|
mpfr_set_r(tmp_abs_re_abs, real_lt_p(l_abs, u_abs) ? l_abs : u_abs);
|
568
573
|
bounds_update_re(bounds, tmp_abs_re_abs, true, true);
|
@@ -573,8 +578,8 @@ Complex* complex_abs (Complex* complex)
|
|
573
578
|
|
574
579
|
if (interval_span_zero_p(complex->re))
|
575
580
|
{
|
576
|
-
l_abs =
|
577
|
-
u_abs =
|
581
|
+
l_abs = real_abs(complex->im->l);
|
582
|
+
u_abs = real_abs(complex->im->u);
|
578
583
|
|
579
584
|
mpfr_set_r(tmp_abs_im_abs, real_lt_p(l_abs, u_abs) ? l_abs : u_abs);
|
580
585
|
bounds_update_re(bounds, tmp_abs_im_abs, true, true);
|
@@ -589,11 +594,11 @@ Complex* complex_abs (Complex* complex)
|
|
589
594
|
bounds_update_re(bounds, tmp_abs_zero, true, true);
|
590
595
|
}
|
591
596
|
|
592
|
-
re =
|
597
|
+
re = interval_new(real_from_mpfr(bounds->re_min, ROUND_DOWN), bounds->re_min_closed, real_from_mpfr(tmp_abs_n_re, ROUND_NEAREST), bounds->re_max_closed, real_from_mpfr(bounds->re_max, bounds->re_max_exact ? ROUND_UP : ROUND_UP1));
|
593
598
|
|
594
599
|
bounds_free(bounds);
|
595
600
|
|
596
|
-
return
|
601
|
+
return complex_new(re, interval_zero());
|
597
602
|
}
|
598
603
|
|
599
604
|
/*
|
@@ -607,10 +612,10 @@ Complex* complex_area (Complex* complex)
|
|
607
612
|
Real* area;
|
608
613
|
Complex* result;
|
609
614
|
|
610
|
-
re_width =
|
611
|
-
im_width =
|
612
|
-
area =
|
613
|
-
result =
|
615
|
+
re_width = real_subtract(complex->re->u, complex->re->l);
|
616
|
+
im_width = real_subtract(complex->im->u, complex->im->l);
|
617
|
+
area = real_multiply(re_width, im_width);
|
618
|
+
result = complex_from_real(area);
|
614
619
|
|
615
620
|
real_free(re_width);
|
616
621
|
real_free(im_width);
|
@@ -632,20 +637,19 @@ Complex* complex_diagonal (Complex* complex)
|
|
632
637
|
Real* im_width2;
|
633
638
|
Real* diag2;
|
634
639
|
Interval* re;
|
635
|
-
Complex* result;
|
636
640
|
|
637
|
-
re_width =
|
638
|
-
im_width =
|
641
|
+
re_width = real_subtract(complex->re->u, complex->re->l);
|
642
|
+
im_width = real_subtract(complex->im->u, complex->im->l);
|
639
643
|
|
640
|
-
re_width2 =
|
641
|
-
im_width2 =
|
644
|
+
re_width2 = real_multiply(re_width, re_width);
|
645
|
+
im_width2 = real_multiply(im_width, im_width);
|
642
646
|
|
643
|
-
diag2 =
|
647
|
+
diag2 = real_add(re_width2, im_width2);
|
644
648
|
|
645
649
|
mpfr_set_r(tmp_diagonal, diag2);
|
646
650
|
mpfr_ternary = mpfr_sqrt(tmp_diagonal, tmp_diagonal, MPFR_RNDN);
|
647
651
|
|
648
|
-
re =
|
652
|
+
re = interval_new(real_from_mpfr(tmp_diagonal, ROUND_DOWN), true, real_from_mpfr(tmp_diagonal, ROUND_NEAREST), true, real_from_mpfr(tmp_diagonal, (mpfr_ternary == 0) ? ROUND_UP : ROUND_UP1));
|
649
653
|
|
650
654
|
real_free(re_width);
|
651
655
|
real_free(im_width);
|
@@ -653,7 +657,7 @@ Complex* complex_diagonal (Complex* complex)
|
|
653
657
|
real_free(im_width2);
|
654
658
|
real_free(diag2);
|
655
659
|
|
656
|
-
return
|
660
|
+
return complex_new(re, interval_zero());
|
657
661
|
}
|
658
662
|
|
659
663
|
/*
|
@@ -662,7 +666,7 @@ Complex* complex_diagonal (Complex* complex)
|
|
662
666
|
*/
|
663
667
|
Complex* complex_conjugate (Complex* complex)
|
664
668
|
{
|
665
|
-
return
|
669
|
+
return complex_new(interval_dup(complex->re), interval_negate(complex->im));
|
666
670
|
}
|
667
671
|
|
668
672
|
/*
|
@@ -670,7 +674,7 @@ Complex* complex_conjugate (Complex* complex)
|
|
670
674
|
*/
|
671
675
|
Complex* complex_negate (Complex* complex)
|
672
676
|
{
|
673
|
-
return
|
677
|
+
return complex_new(interval_negate(complex->re), interval_negate(complex->im));
|
674
678
|
}
|
675
679
|
|
676
680
|
/*
|
@@ -679,7 +683,7 @@ Complex* complex_negate (Complex* complex)
|
|
679
683
|
*/
|
680
684
|
Complex* complex_reflect (Complex* complex)
|
681
685
|
{
|
682
|
-
return
|
686
|
+
return complex_new(interval_dup(complex->im), interval_dup(complex->re));
|
683
687
|
}
|
684
688
|
|
685
689
|
/*
|
@@ -720,7 +724,7 @@ Complex* complex_sqrt (Complex* complex)
|
|
720
724
|
ul_mpc_ternary = mpc_sqrt(tmp_sqrt_ul, tmp_sqrt_ul, MPC_RNDUD);
|
721
725
|
uu_mpc_ternary = mpc_sqrt(tmp_sqrt_uu, tmp_sqrt_uu, MPC_RNDUU);
|
722
726
|
|
723
|
-
bounds =
|
727
|
+
bounds = bounds_new();
|
724
728
|
bounds_update(bounds, tmp_sqrt_ll, complex->re->L, complex->im->L, ll_mpc_ternary);
|
725
729
|
bounds_update(bounds, tmp_sqrt_lu, complex->re->L, complex->im->R, lu_mpc_ternary);
|
726
730
|
bounds_update(bounds, tmp_sqrt_ul, complex->re->R, complex->im->L, ul_mpc_ternary);
|
@@ -734,10 +738,10 @@ Complex* complex_sqrt (Complex* complex)
|
|
734
738
|
bounds_update(bounds, tmp_sqrt_re_sqrt, complex->re->L, true, re_sqrt_mpc_ternary);
|
735
739
|
}
|
736
740
|
|
737
|
-
re =
|
738
|
-
im =
|
741
|
+
re = interval_new(real_from_mpfr(bounds->re_min, ROUND_DOWN), bounds->re_min_closed, real_from_mpfr(tmp_sqrt_n_re, ROUND_NEAREST), bounds->re_max_closed, real_from_mpfr(bounds->re_max, bounds->re_max_exact ? ROUND_UP : ROUND_UP1));
|
742
|
+
im = interval_new(real_from_mpfr(bounds->im_min, ROUND_DOWN), bounds->im_min_closed, real_from_mpfr(tmp_sqrt_n_im, ROUND_NEAREST), bounds->im_max_closed, real_from_mpfr(bounds->im_max, bounds->im_max_exact ? ROUND_UP : ROUND_UP1));
|
739
743
|
|
740
744
|
bounds_free(bounds);
|
741
745
|
|
742
|
-
return
|
746
|
+
return complex_new(re, im);
|
743
747
|
}
|
@@ -0,0 +1,231 @@
|
|
1
|
+
#include "number.h"
|
2
|
+
|
3
|
+
Complex* complex_im (Complex* complex)
|
4
|
+
{
|
5
|
+
return complex_new(interval_dup(complex->im), interval_zero());
|
6
|
+
}
|
7
|
+
|
8
|
+
Complex* complex_im_l (Complex* complex)
|
9
|
+
{
|
10
|
+
return complex_from_real(complex->im->l);
|
11
|
+
}
|
12
|
+
|
13
|
+
Complex* complex_im_n (Complex* complex)
|
14
|
+
{
|
15
|
+
return complex_from_real(complex->im->n);
|
16
|
+
}
|
17
|
+
|
18
|
+
Complex* complex_im_u (Complex* complex)
|
19
|
+
{
|
20
|
+
return complex_from_real(complex->im->u);
|
21
|
+
}
|
22
|
+
|
23
|
+
Complex* complex_im_magnitude (Complex* complex)
|
24
|
+
{
|
25
|
+
Real* l_abs;
|
26
|
+
Real* u_abs;
|
27
|
+
Complex* result;
|
28
|
+
|
29
|
+
l_abs = real_abs(complex->im->l);
|
30
|
+
u_abs = real_abs(complex->im->u);
|
31
|
+
|
32
|
+
result = complex_from_real(real_gt_p(l_abs, u_abs) ? l_abs : u_abs);
|
33
|
+
|
34
|
+
real_free(l_abs);
|
35
|
+
real_free(u_abs);
|
36
|
+
|
37
|
+
return result;
|
38
|
+
}
|
39
|
+
|
40
|
+
Complex* complex_im_mignitude (Complex* complex)
|
41
|
+
{
|
42
|
+
Real* l_abs;
|
43
|
+
Real* u_abs;
|
44
|
+
Real* zero;
|
45
|
+
Complex* result;
|
46
|
+
|
47
|
+
l_abs = real_abs(complex->im->l);
|
48
|
+
u_abs = real_abs(complex->im->u);
|
49
|
+
zero = real_zero();
|
50
|
+
|
51
|
+
result = complex_from_real(interval_span_zero_p(complex->im) ? zero : (real_lt_p(l_abs, u_abs) ? l_abs : u_abs));
|
52
|
+
|
53
|
+
real_free(l_abs);
|
54
|
+
real_free(u_abs);
|
55
|
+
real_free(zero);
|
56
|
+
|
57
|
+
return result;
|
58
|
+
}
|
59
|
+
|
60
|
+
Complex* complex_im_width (Complex* complex)
|
61
|
+
{
|
62
|
+
Real* width;
|
63
|
+
Complex* result;
|
64
|
+
|
65
|
+
width = real_subtract(complex->im->u, complex->im->l);
|
66
|
+
result = complex_from_real(width);
|
67
|
+
|
68
|
+
real_free(width);
|
69
|
+
|
70
|
+
return result;
|
71
|
+
}
|
72
|
+
|
73
|
+
Complex* complex_re (Complex* complex)
|
74
|
+
{
|
75
|
+
return complex_new(interval_dup(complex->re), interval_zero());
|
76
|
+
}
|
77
|
+
|
78
|
+
Complex* complex_re_l (Complex* complex)
|
79
|
+
{
|
80
|
+
return complex_from_real(complex->re->l);
|
81
|
+
}
|
82
|
+
|
83
|
+
Complex* complex_re_n (Complex* complex)
|
84
|
+
{
|
85
|
+
return complex_from_real(complex->re->n);
|
86
|
+
}
|
87
|
+
|
88
|
+
Complex* complex_re_u (Complex* complex)
|
89
|
+
{
|
90
|
+
return complex_from_real(complex->re->u);
|
91
|
+
}
|
92
|
+
|
93
|
+
Complex* complex_re_magnitude (Complex* complex)
|
94
|
+
{
|
95
|
+
Real* l_abs;
|
96
|
+
Real* u_abs;
|
97
|
+
Complex* result;
|
98
|
+
|
99
|
+
l_abs = real_abs(complex->re->l);
|
100
|
+
u_abs = real_abs(complex->re->u);
|
101
|
+
|
102
|
+
result = complex_from_real(real_gt_p(l_abs, u_abs) ? l_abs : u_abs);
|
103
|
+
|
104
|
+
real_free(l_abs);
|
105
|
+
real_free(u_abs);
|
106
|
+
|
107
|
+
return result;
|
108
|
+
}
|
109
|
+
|
110
|
+
Complex* complex_re_mignitude (Complex* complex)
|
111
|
+
{
|
112
|
+
Real* l_abs;
|
113
|
+
Real* u_abs;
|
114
|
+
Real* zero;
|
115
|
+
Complex* result;
|
116
|
+
|
117
|
+
l_abs = real_abs(complex->re->l);
|
118
|
+
u_abs = real_abs(complex->re->u);
|
119
|
+
zero = real_zero();
|
120
|
+
|
121
|
+
result = complex_from_real(interval_span_zero_p(complex->re) ? zero : (real_lt_p(l_abs, u_abs) ? l_abs : u_abs));
|
122
|
+
|
123
|
+
real_free(l_abs);
|
124
|
+
real_free(u_abs);
|
125
|
+
real_free(zero);
|
126
|
+
|
127
|
+
return result;
|
128
|
+
}
|
129
|
+
|
130
|
+
Complex* complex_re_width (Complex* complex)
|
131
|
+
{
|
132
|
+
Real* width;
|
133
|
+
Complex* result;
|
134
|
+
|
135
|
+
width = real_subtract(complex->re->u, complex->re->l);
|
136
|
+
result = complex_from_real(width);
|
137
|
+
|
138
|
+
real_free(width);
|
139
|
+
|
140
|
+
return result;
|
141
|
+
}
|
142
|
+
|
143
|
+
Complex* complex_ll (Complex* complex)
|
144
|
+
{
|
145
|
+
return complex_new(interval_from_real(complex->re->l), interval_from_real(complex->im->l));
|
146
|
+
}
|
147
|
+
|
148
|
+
Complex* complex_lu (Complex* complex)
|
149
|
+
{
|
150
|
+
return complex_new(interval_from_real(complex->re->l), interval_from_real(complex->im->u));
|
151
|
+
}
|
152
|
+
|
153
|
+
Complex* complex_n (Complex* complex)
|
154
|
+
{
|
155
|
+
return complex_new(interval_from_real(complex->re->n), interval_from_real(complex->im->n));
|
156
|
+
}
|
157
|
+
|
158
|
+
Complex* complex_ul (Complex* complex)
|
159
|
+
{
|
160
|
+
return complex_new(interval_from_real(complex->re->u), interval_from_real(complex->im->l));
|
161
|
+
}
|
162
|
+
|
163
|
+
Complex* complex_uu (Complex* complex)
|
164
|
+
{
|
165
|
+
return complex_new(interval_from_real(complex->re->u), interval_from_real(complex->im->u));
|
166
|
+
}
|
167
|
+
|
168
|
+
Complex* complex_magnitude (Complex* complex)
|
169
|
+
{
|
170
|
+
Real* re_l_abs;
|
171
|
+
Real* re_u_abs;
|
172
|
+
Real* im_l_abs;
|
173
|
+
Real* im_u_abs;
|
174
|
+
Complex* result;
|
175
|
+
|
176
|
+
re_l_abs = real_abs(complex->re->l);
|
177
|
+
re_u_abs = real_abs(complex->re->u);
|
178
|
+
im_l_abs = real_abs(complex->im->l);
|
179
|
+
im_u_abs = real_abs(complex->im->u);
|
180
|
+
|
181
|
+
result = complex_new(interval_from_real(real_gt_p(re_l_abs, re_u_abs) ? re_l_abs : re_u_abs), interval_from_real(real_gt_p(im_l_abs, im_u_abs) ? im_l_abs : im_u_abs));
|
182
|
+
|
183
|
+
real_free(re_l_abs);
|
184
|
+
real_free(re_u_abs);
|
185
|
+
real_free(im_l_abs);
|
186
|
+
real_free(im_u_abs);
|
187
|
+
|
188
|
+
return result;
|
189
|
+
}
|
190
|
+
|
191
|
+
Complex* complex_mignitude (Complex* complex)
|
192
|
+
{
|
193
|
+
Real* re_l_abs;
|
194
|
+
Real* re_u_abs;
|
195
|
+
Real* im_l_abs;
|
196
|
+
Real* im_u_abs;
|
197
|
+
Real* zero;
|
198
|
+
Complex* result;
|
199
|
+
|
200
|
+
re_l_abs = real_abs(complex->re->l);
|
201
|
+
re_u_abs = real_abs(complex->re->u);
|
202
|
+
im_l_abs = real_abs(complex->im->l);
|
203
|
+
im_u_abs = real_abs(complex->im->u);
|
204
|
+
|
205
|
+
zero = real_zero();
|
206
|
+
result = complex_new(interval_from_real(interval_span_zero_p(complex->re) ? zero : (real_lt_p(re_l_abs, re_u_abs) ? re_l_abs : re_u_abs)), interval_from_real(interval_span_zero_p(complex->im) ? zero : (real_lt_p(im_l_abs, im_u_abs) ? im_l_abs : im_u_abs)));
|
207
|
+
|
208
|
+
real_free(re_l_abs);
|
209
|
+
real_free(re_u_abs);
|
210
|
+
real_free(im_l_abs);
|
211
|
+
real_free(im_u_abs);
|
212
|
+
real_free(zero);
|
213
|
+
|
214
|
+
return result;
|
215
|
+
}
|
216
|
+
|
217
|
+
Complex* complex_width (Complex* complex)
|
218
|
+
{
|
219
|
+
Real* re_width;
|
220
|
+
Real* im_width;
|
221
|
+
Complex* result;
|
222
|
+
|
223
|
+
re_width = real_subtract(complex->re->u, complex->re->l);
|
224
|
+
im_width = real_subtract(complex->im->u, complex->im->l);
|
225
|
+
result = complex_new(interval_from_real(re_width), interval_from_real(im_width));
|
226
|
+
|
227
|
+
real_free(re_width);
|
228
|
+
real_free(im_width);
|
229
|
+
|
230
|
+
return result;
|
231
|
+
}
|