Дэвид Эйзенстат заставил меня задуматься.
Я хочу, чтобы простые случаи были быстрыми: пусть об этом позаботится double
. Ньютон-Рафсон может быть лучшим выбором для отдыха.
/** Multiplies both factor
s
* and divides by divisor
.
* @return Long.MIN_VALUE
if result out of range,
* else factorA * factor1 / divisor
*/
public static long
mulDiv(long factorA, long factor1, long divisor) {
final double dd = divisor,
product = (double)factorA * factor1,
a1_d = product / dd;
if (a1_d < -TOO_LARGE || TOO_LARGE < a1_d)
return tooLarge();
if (-ONE_ < a1_d && a1_d < ONE_)
return 0;
if (-EXACT < product && product < EXACT)
return (long) a1_d;
long pLo = factorA * factor1, //diff,
pHi = high64(factorA, factor1);
if (a1_d < -LONG_MAX_ || LONG_MAX_ < a1_d) {
long maxdHi = divisor >> 1;
if (maxdHi < pHi
|| maxdHi == pHi
&& Long.compareUnsigned((divisor << Long.SIZE-1),
pLo) <= 0)
return tooLarge();
}
final double high_dd = TWO_POWER64/dd;
long quotient = (long) a1_d,
loPP = quotient * divisor,
hiPP = high64(quotient, divisor);
long remHi = pHi - hiPP, // xxx overflow/carry
remLo = pLo - loPP;
if (Long.compareUnsigned(pLo, remLo) < 0)
remHi -= 1;
double fudge = remHi * high_dd;
if (remLo < 0)
fudge += high_dd;
fudge += remLo/dd;
long //fHi = (long)fudge/TWO_POWER64,
fLo = (long) Math.floor(fudge); //*round
quotient += fLo;
loPP = quotient * divisor;
hiPP = high64(quotient, divisor);
remHi = pHi - hiPP; // should be 0?!
remLo = pLo - loPP;
if (Long.compareUnsigned(pLo, remLo) < 0)
remHi -= 1;
if (0 == remHi && 0 <= remLo && remLo < divisor)
return quotient;
fudge = remHi * high_dd;
if (remLo < 0)
fudge += high_dd;
fudge += remLo/dd;
fLo = (long) Math.floor(fudge);
return quotient + fLo;
}
/** max double
trusted to represent
* a value in the range of long
*/
static final double
LONG_MAX_ = Double.valueOf(Long.MAX_VALUE - 0xFFF);
/** max double
trusted to represent a value below 1 */
static final double
ONE_ = Double.longBitsToDouble(
Double.doubleToRawLongBits(1) - 4);
/** max double
trusted to represent a value exactly */
static final double
EXACT = Long.MAX_VALUE >> 12;
static final double
TWO_POWER64 = Double.valueOf(1L<<32)*Double.valueOf(1L<<32);
static long tooLarge() {
// throw new RuntimeException("result too large for long");
return Long.MIN_VALUE;
}
static final long ONES_32 = ~(~0L << 32);
static long high64(long factorA, long factor1) {
long loA = factorA & ONES_32,
hiA = factorA >>> 32,
lo1 = factor1 & ONES_32,
hi1 = factor1 >>> 32;
return ((loA * lo1 >>> 32)
+loA * hi1 + hiA * lo1 >>> 32)
+ hiA * hi1;
}
(Я переставил этот код из IDE так, чтобы на нем было mulDiv()
. Будучи ленивым, у меня есть оболочка для обработки знаков - возможно, попробую сделать это правильно, пока ад не замерзнет.
[ 116] Для синхронизации крайне необходима модель ввода:
Как насчет , чтобы каждый возможный результат был одинаково вероятным ?)
Таким образом, я нашел ответ на свой собственный вопрос. Необходимо установить Средства разработки Java Eclipse. Они могут быть найдены при Ganymede> Разработка Java> Средства разработки Java Eclipse в Справке> Обновления программного обеспечения> Доступное программное обеспечение.
Не совсем уверенный, что Вы ищете, но здесь являетесь списком плагинов Муравья Eclipse:
Спасибо, у меня просто была та же проблема, и как Вы сказали, Средства разработки Java содержали Муравья.
После того как Вы будите Муравья и выполнение, можно столкнуться со связанной проблемой - это предупреждение во всех файлах Муравья:
Никакие ограничения грамматики (DTD или XML-схема) обнаруженный для документа.
Детали находятся в этом вопросе о Переполнении стека, но короткий ответ, который я использовал, должен был добавить этот минимальный DTD к моим файлам типа "build":
<!DOCTYPE project>
Похоже, должен быть лучший вариант. Ant - это автономный инструмент. Вам не нужно загружать все инструменты Java только для того, чтобы получить Ant.
This drove me crazy a couple days ago. In Galileo the update process is slightly different, which is bad forward design if you ask me (but I digress). Here's how you do it in Eclipse 3.5.
Help > Install New Software
From "Work with:" dropdown choose "Galileo - http://download.eclipse.org/releases/galileo"
Then expand "Programming Languages" and choose "Eclipse Java Development Tools".
You could install a different plugin, but this is the standard Eclipse Install.