Lines Matching refs:x

235   my ($c,$x);
239 ($c,$x) = @_;
243 $x = shift;
244 $c = ref($x);
246 return unless ref($x); # only for objects
250 $self->{sign} = $x->{sign};
251 $self->{_d} = $x->{_d}->copy();
252 $self->{_n} = $x->{_n}->copy();
253 $self->{_a} = $x->{_a} if defined $x->{_a};
254 $self->{_p} = $x->{_p} if defined $x->{_p};
277 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
279 if ($x->{sign} !~ /^[+-]$/) # inf, NaN etc
281 my $s = $x->{sign}; $s =~ s/^\+//; # +inf => inf
285 my $s = ''; $s = $x->{sign} if $x->{sign} ne '+'; # '+3/2' => '3/2'
287 return $s . $x->{_n}->bstr() if $x->{_d}->is_one();
288 $s . $x->{_n}->bstr() . '/' . $x->{_d}->bstr();
293 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
295 if ($x->{sign} !~ /^[+-]$/) # inf, NaN etc
297 my $s = $x->{sign}; $s =~ s/^\+//; # +inf => inf
301 my $s = ''; $s = $x->{sign} if $x->{sign} ne '+'; # +3 vs 3
302 $s . $x->{_n}->bstr() . '/' . $x->{_d}->bstr();
309 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
312 if (ref($x->{_n}) ne $MBI)
314 require Carp; Carp::croak ("n is not $MBI but (".ref($x->{_n}).')');
316 if (ref($x->{_d}) ne $MBI)
318 require Carp; Carp::croak ("d is not $MBI but (".ref($x->{_d}).')');
322 $x->{_d}->{_f} = MB_NEVER_ROUND;
323 $x->{_n}->{_f} = MB_NEVER_ROUND;
325 delete $x->{_d}->{_a}; delete $x->{_n}->{_a};
326 delete $x->{_d}->{_p}; delete $x->{_n}->{_p};
329 return $x if $x->{sign} !~ /^[+-]$/;
332 if (($x->{sign} =~ /^[+-]$/) &&
333 ($x->{_n}->is_zero()))
335 $x->{sign} = '+'; # never -0
336 $x->{_d} = $MBI->bone() unless $x->{_d}->is_one();
337 return $x;
340 return $x if $x->{_d}->is_one(); # no need to reduce
347 my $gcd = $x->{_n}->bgcd($x->{_d});
351 $x->{_n}->bdiv($gcd);
352 $x->{_d}->bdiv($gcd);
354 $x;
414 my ($self,$x,$y,@r) = (ref($_[0]),@_);
418 ($self,$x,$y,@r) = objectify(2,@_);
421 $x = $self->new($x) unless $x->isa($self);
424 return $x->bnan() if ($x->{sign} eq 'NaN' || $y->{sign} eq 'NaN');
441 $x->{_n}->bmul($y->{_d}); $x->{_n}->{sign} = $x->{sign};
442 my $m = $y->{_n}->copy()->bmul($x->{_d});
444 $x->{_n}->badd($m);
446 $x->{_d}->bmul($y->{_d});
449 $x->{sign} = $x->{_n}->{sign}; $x->{_n}->{sign} = '+';
451 $x->bnorm()->round(@r);
459 my ($self,$x,$y,@r) = (ref($_[0]),@_);
463 ($self,$x,$y,@r) = objectify(2,@_);
467 $x->{sign} =~ tr/+-/-+/
468 unless $x->{sign} eq '+' && $x->{_n}->is_zero(); # not -0
469 $x->badd($y,@r); # does norm and round
470 $x->{sign} =~ tr/+-/-+/
471 unless $x->{sign} eq '+' && $x->{_n}->is_zero(); # not -0
472 $x;
480 my ($self,$x,$y,@r) = (ref($_[0]),@_);
484 ($self,$x,$y,@r) = objectify(2,@_);
487 $x = $self->new($x) unless $x->isa($self);
490 return $x->bnan() if ($x->{sign} eq 'NaN' || $y->{sign} eq 'NaN');
493 if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
495 return $x->bnan() if $x->is_zero() || $y->is_zero();
499 return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
500 return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
501 return $x->binf('-');
505 return wantarray ? ($x,$self->bzero()) : $x if $x->is_zero();
516 $x->{_n}->bmul($y->{_n});
517 $x->{_d}->bmul($y->{_d});
520 $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-';
522 $x->bnorm()->round(@r);
531 my ($self,$x,$y,@r) = (ref($_[0]),@_);
535 ($self,$x,$y,@r) = objectify(2,@_);
538 $x = $self->new($x) unless $x->isa($self);
541 return $self->_div_inf($x,$y)
542 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
545 return wantarray ? ($x,$self->bzero()) : $x if $x->is_zero();
555 $x->{_n}->bmul($y->{_d});
556 $x->{_d}->bmul($y->{_n});
559 $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-';
561 $x->bnorm()->round(@r);
562 $x;
570 my ($self,$x,$y,@r) = (ref($_[0]),@_);
574 ($self,$x,$y,@r) = objectify(2,@_);
577 $x = $self->new($x) unless $x->isa($self);
580 return $self->_div_inf($x,$y)
581 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
583 return $self->_div_inf($x,$y)
584 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
586 return $x if $x->is_zero(); # 0 / 7 = 0, mod 0
595 my $u = $x->copy()->babs();
612 my $xsign = $x->{sign}; $x->{sign} = '+'; # remember sign and make abs
614 $x->bsub($u);
615 $x->{sign} = $xsign; # put sign back
617 $x->bnorm()->round(@r);
626 my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
628 return $x if $x->{sign} !~ /^[+-]$/; # NaN, inf, -inf
632 if ($x->{sign} eq '-')
634 $x->{_n}->badd($x->{_d}); # -5/2 => -7/2
638 if ($x->{_n}->bacmp($x->{_d}) < 0)
641 $x->{_n} = $x->{_d} - $x->{_n};
642 $x->{sign} = '-';
646 $x->{_n}->bsub($x->{_d}); # 5/2 => 3/2
649 $x->bnorm()->round(@r);
655 my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
657 return $x if $x->{sign} !~ /^[+-]$/; # NaN, inf, -inf
661 if ($x->{sign} eq '-')
663 if ($x->{_n}->bacmp($x->{_d}) < 0)
666 $x->{_n} = $x->{_d} - $x->{_n};
667 $x->{sign} = '+';
671 $x->{_n}->bsub($x->{_d}); # -5/2 => -3/2
676 $x->{_n}->badd($x->{_d}); # 5/2 => 7/2
678 $x->bnorm()->round(@r);
687 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
689 return 1 if ($x->{sign} =~ /^[+-]$/) && # NaN and +-inf aren't
690 $x->{_d}->is_one(); # x/y && y != 1 => no integer
697 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
699 return 1 if $x->{sign} eq '+' && $x->{_n}->is_zero();
706 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
710 if ($x->{sign} eq $sign && $x->{_n}->is_one() && $x->{_d}->is_one());
717 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
719 return 1 if ($x->{sign} =~ /^[+-]$/) && # NaN & +-inf aren't
720 ($x->{_d}->is_one() && $x->{_n}->is_odd()); # x/2 is not, but 3/1
727 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
729 return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't
730 return 1 if ($x->{_d}->is_one() # x/3 is never
731 && $x->{_n}->is_even()); # but 4/1 is
740 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
742 return $MBI->new($x->{sign}) if ($x->{sign} !~ /^[+-]$/);
744 my $n = $x->{_n}->copy(); $n->{sign} = $x->{sign};
750 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
752 return $MBI->new($x->{sign}) if ($x->{sign} !~ /^[+-]$/);
753 $x->{_d}->copy();
758 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
760 return ($self->bnan(),$self->bnan()) if $x->{sign} eq 'NaN';
761 return ($self->binf(),$self->binf()) if $x->{sign} eq '+inf';
762 return ($self->binf('-'),$self->binf()) if $x->{sign} eq '-inf';
764 my $n = $x->{_n}->copy();
765 $n->{sign} = $x->{sign};
766 return ($n,$x->{_d}->copy());
771 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
773 return $nan unless $x->is_int();
774 $x->{_n}->length(); # length(-123/1) => length(123)
779 my ($self,$x,$n) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
781 return $nan unless $x->is_int();
782 $x->{_n}->digit($n); # digit(-123/1,2) => digit(123,2)
790 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
792 return $x unless $x->{sign} =~ /^[+-]$/;
793 return $x if $x->{_d}->is_one(); # 22/1 => 22, 0/1 => 0
798 $x->{_n}->bdiv($x->{_d}); # 22/7 => 3/1 w/ truncate
799 $x->{_d}->bone();
800 $x->{_n}->binc() if $x->{sign} eq '+'; # +22/7 => 4/1
801 $x->{sign} = '+' if $x->{_n}->is_zero(); # -0 => 0
802 $x;
807 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
809 return $x unless $x->{sign} =~ /^[+-]$/;
810 return $x if $x->{_d}->is_one(); # 22/1 => 22, 0/1 => 0
815 $x->{_n}->bdiv($x->{_d}); # 22/7 => 3/1 w/ truncate
816 $x->{_d}->bone();
817 $x->{_n}->binc() if $x->{sign} eq '-'; # -22/7 => -4/1
818 $x;
823 my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
826 if (($x->{sign} eq '+') && ($x->{_d}->is_one()))
828 $x->{_n}->bfac();
829 return $x->round(@r);
831 $x->bnan();
839 my ($self,$x,$y,@r) = (ref($_[0]),@_);
843 ($self,$x,$y,@r) = objectify(2,@_);
846 return $x if $x->{sign} =~ /^[+-]inf$/; # -inf/+inf ** x
847 return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan;
848 return $x->bone(@r) if $y->is_zero();
849 return $x->round(@r) if $x->is_one() || $y->is_one();
850 if ($x->{sign} eq '-' && $x->{_n}->is_one() && $x->{_d}->is_one())
853 return $y->is_odd() ? $x->round(@r) : $x->babs()->round(@r);
859 return $x->round(@r) if $x->is_zero(); # 0**y => 0 (if not y <= 0)
865 if ($x->{_d}->is_one())
867 $x->{_n}->bpow($y->{_n}); # x/1 ** y/1 => (x ** y)/1
871 ($x->{_n},$x->{_d}) = ($x->{_d},$x->{_n}); # swap
874 if ($x->{sign} eq '-')
877 $x->{sign} = '+' if $y->{_n}->is_even();
879 return $x->round(@r);
882 $x->{_n}->bpow($y->{_n}); # 5/2 ** y/1 => 5 ** y / 2 ** y
883 $x->{_d}->bpow($y->{_n});
887 ($x->{_n},$x->{_d}) = ($x->{_d},$x->{_n}); # swap
890 if ($x->{sign} eq '-')
893 $x->{sign} = '+' if $y->{_n}->is_even();
895 return $x->round(@r);
904 $pow2->bmul($x) if $y1->is_odd();
906 $x->bmul($x);
908 $x->bmul($pow2) unless $pow2->is_one();
910 ($x->{_d},$x->{_n}) = ($x->{_n},$x->{_d}) if $y->{sign} eq '-';
911 $x->bnorm()->round(@r);
917 my ($self,$x,$y,@r) = (ref($_[0]),@_);
922 ($self,$x,$y,@r) = objectify(2,$class,@_);
926 return $x->bzero() if $x->is_one() && $y->{sign} eq '+';
929 return $x->bnan() if $x->is_zero() || $x->{sign} ne '+' || $y->{sign} ne '+';
931 if ($x->is_int() && $y->is_int())
933 return $self->new($x->as_number()->blog($y->as_number(),@r));
937 $x->_new_from_float( $x->_as_float()->blog(Math::BigFloat->new("$y"),@r) );
942 my $x = shift;
948 Math::BigFloat->new($x->{_n})->bdiv($x->{_d}, $x->accuracy());
954 my ($self,$x,$y,@r) = (ref($_[0]),@_);
958 ($self,$x,$y,@r) = objectify(2,@_);
961 if ($x->is_int() && $y->is_int())
963 return $self->new($x->as_number()->broot($y->as_number(),@r));
967 $x->_new_from_float( $x->_as_float()->broot($y,@r) );
973 my ($self,$x,$y,$m,@r) = (ref($_[0]),@_);
977 ($self,$x,$y,$m,@r) = objectify(3,@_);
981 return $x->bnan()
982 if $x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/ ||
985 if ($x->is_int() && $y->is_int() && $m->is_int())
987 return $self->new($x->as_number()->bmodpow($y->as_number(),$m,@r));
991 $x->bnan();
997 my ($self,$x,$y,@r) = (ref($_[0]),@_);
1001 ($self,$x,$y,@r) = objectify(2,@_);
1005 return $x->bnan()
1006 if $x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/;
1008 if ($x->is_int() && $y->is_int())
1010 return $self->new($x->as_number()->bmodinv($y->as_number(),@r));
1014 $x->bnan();
1019 my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
1021 return $x->bnan() if $x->{sign} !~ /^[+]/; # NaN, -inf or < 0
1022 return $x if $x->{sign} eq '+inf'; # sqrt(inf) == inf
1023 return $x->round(@r) if $x->is_zero() || $x->is_one();
1033 $x->{_d} = Math::BigFloat->new($x->{_d})->bsqrt();
1034 $x->{_n} = Math::BigFloat->new($x->{_n})->bsqrt();
1037 if ($x->{_d}->{_es} ne '+')
1039 $x->{_n}->blsft($x->{_d}->exponent()->babs(),10); # 7.1/4.51 => 7.1/45.1
1040 $x->{_d} = $MBI->new($CALC->_str($x->{_d}->{_m})); # 7.1/45.1 => 71/45.1
1043 if ($x->{_n}->{_es} ne '+')
1045 $x->{_d}->blsft($x->{_n}->exponent()->babs(),10); # 71/45.1 => 710/45.1
1046 $x->{_n} = $MBI->new($CALC->_str($x->{_n}->{_m})); # 710/45.1 => 710/451
1050 $x->{_n} = $x->{_n}->as_number() unless $x->{_n}->isa($MBI);
1051 $x->{_d} = $x->{_d}->as_number() unless $x->{_d}->isa($MBI);
1052 $x->bnorm()->round(@r);
1057 my ($self,$x,$y,$b,@r) = objectify(3,@_);
1061 $x->bmul( $b->copy()->bpow($y), @r);
1062 $x;
1067 my ($self,$x,$y,$b,@r) = objectify(2,@_);
1071 $x->bdiv( $b->copy()->bpow($y), @r);
1072 $x;
1101 my ($self,$x,$y) = (ref($_[0]),@_);
1105 ($self,$x,$y) = objectify(2,@_);
1108 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
1111 return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
1112 return 0 if $x->{sign} eq $y->{sign} && $x->{sign} =~ /^[+-]inf$/;
1113 return +1 if $x->{sign} eq '+inf';
1114 return -1 if $x->{sign} eq '-inf';
1119 return 1 if $x->{sign} eq '+' && $y->{sign} eq '-'; # does also 0 <=> -y
1120 return -1 if $x->{sign} eq '-' && $y->{sign} eq '+'; # does also -x <=> 0
1123 my $xz = $x->{_n}->is_zero();
1127 return 1 if $yz && $x->{sign} eq '+'; # +x <=> 0
1129 my $t = $x->{_n} * $y->{_d}; $t->{sign} = $x->{sign};
1130 my $u = $y->{_n} * $x->{_d}; $u->{sign} = $y->{sign};
1139 my ($self,$x,$y) = (ref($_[0]),@_);
1143 ($self,$x,$y) = objectify(2,$class,@_);
1146 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
1149 return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
1150 return 0 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} =~ /^[+-]inf$/;
1151 return 1 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} !~ /^[+-]inf$/;
1155 my $t = $x->{_n} * $y->{_d};
1156 my $u = $y->{_n} * $x->{_d};
1166 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
1168 return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, NaN, etc
1171 return $x->{_n}->numify() if $x->{_d}->is_one();
1174 my $neg = 1; $neg = -1 if $x->{sign} ne '+';
1175 $neg * $x->{_n}->numify() / $x->{_d}->numify(); # return sign * N/D
1180 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1182 return $x if $x->{sign} !~ /^[+-]$/; # NaN, inf etc
1188 my $t = $x->{_n}->copy()->bdiv($x->{_d}); # 22/7 => 3
1189 $t->{sign} = $x->{sign};
1195 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1197 return $x unless $x->is_int();
1199 my $s = $x->{sign}; $s = '' if $s eq '+';
1200 $s . $x->{_n}->as_bin();
1205 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1207 return $x unless $x->is_int();
1209 my $s = $x->{sign}; $s = '' if $s eq '+';
1210 $s . $x->{_n}->as_hex();