number 0.9.7 → 0.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
}
|