Hello.

> > [...]
> >
> >>
> >> Also looking at Complex it would benefit from:
> >>
> >>    public Complex subtractFrom(double minuend) {
> >>        return new Complex(minuend - real, imaginary);
> >>    }
> >
> > Is it part of the "standard"?
> > IMHO, it's fairly confusing, as nothing in the name indicates
> > that the operation only applies to the real part.
>
> The same applies for the add(real) and subtract(real) methods.
>
> What is confusing is the unconventional reverse ordering of z.subtractFrom(a) 
> == a - z. I’m not happy about it but the javadoc can explain the outcome.

Actually, what confuses me is that the above equality does not hold:
  double a = 5;
  Complex z = Complex.of(1, 3);
  Complex z2 = z.subtractFrom(a);
would yield
  4 + 3 i
whereas
  Complex z2 = Complex.of(a).subtract(z);
would yield
  4 - 3 i

Regards,
Gilles

> It is possible in C:
>
> #include <stdio.h>
> #include <complex.h>
> #include <math.h>
> #include <float.h>
>
> int main( int argc, const char* argv[] ) {
>   double a = 5.0;
>   complex double z = 1 + 3 * I;
>   complex double z2 = a - z;
>   printf("%.17g + %.17g i\n", creal(z2), cimag(z2));
>   complex double z3 = z - a;
>   printf("%.17g + %.17g i\n", creal(z3), cimag(z3));
> }
>
> And C++:
>
> #include <complex>
> #include <math.h>
> #include <float.h>
>
> int main( int argc, const char* argv[] ) {
>   const double a = 5.0;
>   std::complex<double> z(1, 3);
>   std::complex<double> z2 = a - z;
>   printf("%.17g + %.17g i\n", z2.real(), z2.imag());
>   std::complex<double> z3 = z - a;
>   printf("%.17g + %.17g i\n", z3.real(), z3.imag());
> }
>
> Both yield:
>
> 4 + -3 i
> -4 + 3 i
>
> Note that Complex::add(double) exists. This needs no alternative as the 
> addition of the real to the real component is commutative:
>
> double a
> complex z
> a + z = z + a
>
> The subtraction is not commutative (as shown above):
> a - z != z - a
>
> So given the Complex has a subtract(double) it would be fair to have a 
> subtractFrom(double).
>
> The complex subtraction is also not commutative:
>
> complex y
> complex z
> y - z != z - y
>
> But in this case you can achieve the same with the API by swapping the 
> arguments.
>
> >
> >>
> >> This would avoid:
> >>
> >> Complex a = …;
> >> double b = …;
> >> Complex c  = Complex.ofCartesian(b - a.real(), a.imag());
> >
> > This is clear.
> >
> >> Complex d  = Complex.ofReal(b).subtract(a).conj();
> >
> > This even more, but, I get it, with 3 instantiations instead of 1.
> >
> >>
> >> With
> >>
> >> Complex a = …;
> >> double b = …;
> >> Complex c  = a.subtractFrom(b);
> >
> > Looks ambiguous...  But if it's standard naming.
> >
> > Regards,
> > Gilles
> >
> >>
> >>>
> >>>>
> >>>>
> >>>> [1] http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 
> >>>> <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf>
> >>>>
> >>>> [2] http://www.open-std.org/JTC1/SC22/WG14/www/standards 
> >>>> <http://www.open-std.org/JTC1/SC22/WG14/www/standards>
> >>>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to