Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 310397 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/draw2d/geometry/Vector.java (-12 / +13 lines)
Lines 14-21 Link Here
14
package org.eclipse.draw2d.geometry;
14
package org.eclipse.draw2d.geometry;
15
15
16
import java.math.BigDecimal;
16
import java.math.BigDecimal;
17
import java.math.MathContext;
18
import java.math.RoundingMode;
19
17
20
/**
18
/**
21
 * Represents a vector within 2-dimensional Euclidean space.
19
 * Represents a vector within 2-dimensional Euclidean space.
Lines 324-361 Link Here
324
	 * converting to 16 digits precision (and scale), so there are no undesired
322
	 * converting to 16 digits precision (and scale), so there are no undesired
325
	 * rounding effects.
323
	 * rounding effects.
326
	 */
324
	 */
327
	private static final MathContext CONTEXT = MathContext.DECIMAL64;
325
	private static final int ROUNDING = BigDecimal.ROUND_HALF_EVEN;
328
	private static final RoundingMode ROUNDING = CONTEXT.getRoundingMode();
326
	private static final int SCALE = 16;
329
	private static final int SCALE = CONTEXT.getPrecision();
330
327
331
	private static final double preciseAdd(double d1, double d2) {
328
	private static final double preciseAdd(double d1, double d2) {
332
		return BigDecimal.valueOf(d1).add(BigDecimal.valueOf(d2), CONTEXT)
329
		return doubleToBigDecimal(d1).add(doubleToBigDecimal(d2))
333
				.setScale(SCALE, ROUNDING).doubleValue();
330
				.setScale(SCALE, ROUNDING).doubleValue();
334
	}
331
	}
335
332
336
	private static final double preciseSubtract(double d1, double d2) {
333
	private static final double preciseSubtract(double d1, double d2) {
337
		return BigDecimal.valueOf(d1).subtract(BigDecimal.valueOf(d2), CONTEXT)
334
		return doubleToBigDecimal(d1).subtract(doubleToBigDecimal(d2))
338
				.setScale(SCALE, ROUNDING).doubleValue();
335
				.setScale(SCALE, ROUNDING).doubleValue();
339
	}
336
	}
340
337
341
	private static final double preciseMultiply(double d1, double d2) {
338
	private static final double preciseMultiply(double d1, double d2) {
342
		return BigDecimal.valueOf(d1).multiply(BigDecimal.valueOf(d2), CONTEXT)
339
		return doubleToBigDecimal(d1).multiply(doubleToBigDecimal(d2))
343
				.setScale(SCALE, ROUNDING).doubleValue();
340
				.setScale(SCALE, ROUNDING).doubleValue();
344
	}
341
	}
345
342
346
	private static final double preciseDivide(double d1, double d2) {
343
	private static final double preciseDivide(double d1, double d2) {
347
		return BigDecimal.valueOf(d1).divide(BigDecimal.valueOf(d2), CONTEXT)
344
		return doubleToBigDecimal(d1).divide(doubleToBigDecimal(d2), SCALE, ROUNDING).doubleValue();
348
				.setScale(SCALE, ROUNDING).doubleValue();
349
	}
345
	}
350
346
351
	private static final double preciseNegate(double d) {
347
	private static final double preciseNegate(double d) {
352
		return BigDecimal.valueOf(d).negate(CONTEXT).setScale(SCALE, ROUNDING)
348
		return doubleToBigDecimal(d).negate().setScale(SCALE, ROUNDING)
353
				.doubleValue();
349
				.doubleValue();
354
	}
350
	}
355
351
356
	private static final double preciseAbs(double d) {
352
	private static final double preciseAbs(double d) {
357
		return BigDecimal.valueOf(d).abs(CONTEXT).setScale(SCALE, ROUNDING)
353
		return doubleToBigDecimal(d).abs().setScale(SCALE, ROUNDING)
358
				.doubleValue();
354
				.doubleValue();
359
	}
355
	}
360
356
357
	private static final BigDecimal doubleToBigDecimal(double d){
358
		// May not use BigDecimal.valueOf due to J2SE-1.4 backwards compatibility
359
		return new BigDecimal(Double.toString(d)); 
360
	}
361
	
361
}
362
}

Return to bug 310397