0

我正在尝试创建此方法,但由于某种原因它不起作用...

public static Interval multiply(Interval x, Interval y) {
   int min = Math.min(x.lo * y.lo, x.hi * y.hi, x.hi * y.lo, x.hi * y.hi);
   int max = Math.max(x.lo * y.lo, x.hi * y.hi, x.hi * y.lo, x.hi * y.hi);
   return new Interval(min, max);

它与 Math.min/Math.max 有关,但我查了一下,所以我不确定我是如何使用不正确的??

4

2 回答 2

1

丑陋,但是:

public static Interval multiply(Interval x, Interval y) {
   int min = Math.min(Math.min(Math.min(x.lo * y.lo, x.hi * y.hi), x.hi * y.lo), x.hi * y.hi);
   int max = Math.max(Math.max(Math.max(x.lo * y.lo, x.hi * y.hi), x.hi * y.lo), x.hi * y.hi);
   return new Interval(min, max);
于 2013-02-10T01:53:17.100 回答
0

说我疯了,但是由于区间的乘法从不使用它自己的高和低,根据定义,只要数字是正数,低和高的结果将是低*低和高*高。只要您明确知道该数字始终是正数(就像您在使用时间一样),您就可以这样做:

public static Interval multiply(Interval x, Interval y){
   return new Interval(x.lo*y.lo, x.hi*y.hi);
}

如果你不确定,你可以试试这个:

public static Interval multiply(Interval x, Interval y){
   int min = (x.lo*y.lo <= x.lo*y.hi) ? x.lo*y.lo: x.lo*y.hi;
   min = (min <= x.hi*y.lo) ? min: x.hi*y.lo;
   min = (min <= x.hi*y.hi) ? min: x.hi*y.hi;
   int max = (x.lo*y.lo >= x.lo*y.hi) ? x.lo*y.lo: x.lo*y.hi;
   max = (max >= x.hi*y.lo) ? max: x.hi*y.lo;
   max = (max >= x.hi*y.hi) ? max: x.hi*y.hi;
   return new Interval(min, max);
}

使用位运算符可能有更好的方法来完成这些比较,但我不知道如何。

于 2013-02-10T02:23:35.020 回答