mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-05-23 13:25:47 +00:00
128 lines
4.3 KiB
Java
128 lines
4.3 KiB
Java
/*
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
* (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*/
|
|
|
|
package macromedia.asc.util;
|
|
|
|
import java.math.*;
|
|
|
|
public class Decimal128Context {
|
|
|
|
private MathContext bdctx;
|
|
public int status;
|
|
|
|
public Decimal128Context() {
|
|
status = 0;
|
|
try {
|
|
bdctx = new MathContext(34, RoundingMode.HALF_EVEN);
|
|
} catch (NoClassDefFoundError e) {
|
|
bdctx = null; // we're not going to be using decimal stuff on 1.4
|
|
}
|
|
}
|
|
|
|
public Decimal128Context(int precision, RoundingMode rounding) {
|
|
|
|
status = 0;
|
|
try {
|
|
bdctx = new MathContext(precision, rounding);
|
|
} catch (NoClassDefFoundError e) {
|
|
bdctx = null; // we're not going to be using decimal stuff on 1.4
|
|
}
|
|
}
|
|
|
|
|
|
public int getPrecision() {
|
|
return bdctx.getPrecision();
|
|
}
|
|
|
|
public RoundingMode getRoundingMode() {
|
|
return bdctx.getRoundingMode();
|
|
}
|
|
|
|
protected MathContext mathCtx() { // should be visible only to Decimal128
|
|
return bdctx;
|
|
}
|
|
/* Should these be immutable like MathContext? It's hard to have the status field
|
|
* reflect error history if that is the case
|
|
*/
|
|
|
|
public void setPrecision (int precision) {
|
|
if (precision < 1 || precision > 34) {
|
|
throw new IllegalArgumentException("Precision must be between 1 and 34");
|
|
}
|
|
if (bdctx.getPrecision() != precision) {
|
|
bdctx = new MathContext(precision, bdctx.getRoundingMode());
|
|
}
|
|
}
|
|
|
|
public void setRoundingMode(RoundingMode mode) {
|
|
if (bdctx.getRoundingMode() != mode) {
|
|
bdctx = new MathContext(bdctx.getPrecision(), mode);
|
|
}
|
|
}
|
|
|
|
private static RoundingMode defaultMode() {
|
|
RoundingMode result;
|
|
try {
|
|
result = RoundingMode.HALF_EVEN;
|
|
} catch (NoClassDefFoundError e) {
|
|
result = null; // we're not going to be using decimal stuff on 1.4
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static final Decimal128Context DECIMAL128 = new Decimal128Context(34, defaultMode());
|
|
|
|
/* Trap-enabler and Status flags (exceptional conditions), and their names */
|
|
// Top byte is reserved for internal use
|
|
static final int DEC_Conversion_syntax = 0x00000001;
|
|
static final int DEC_Division_by_zero = 0x00000002;
|
|
static final int DEC_Division_impossible = 0x00000004;
|
|
static final int DEC_Division_undefined = 0x00000008;
|
|
static final int DEC_Insufficient_storage = 0x00000010;
|
|
static final int DEC_Inexact = 0x00000020;
|
|
static final int DEC_Invalid_context = 0x00000040;
|
|
static final int DEC_Invalid_operation = 0x00000080;
|
|
static final int DEC_Overflow = 0x00000200;
|
|
static final int DEC_Clamped = 0x00000400;
|
|
static final int DEC_Rounded = 0x00000800;
|
|
static final int DEC_Subnormal = 0x00001000;
|
|
static final int DEC_Underflow = 0x00002000;
|
|
static final int DEC_sNaN = 0x40000000;
|
|
|
|
// name strings for the exceptional conditions
|
|
|
|
static final String DEC_Condition_CS = "Conversion syntax";
|
|
static final String DEC_Condition_DZ = "Division by zero";
|
|
static final String DEC_Condition_DI = "Division impossible";
|
|
static final String DEC_Condition_DU = "Division undefined";
|
|
static final String DEC_Condition_IE = "Inexact";
|
|
static final String DEC_Condition_IS = "Insufficient storage";
|
|
static final String DEC_Condition_IC = "Invalid context";
|
|
static final String DEC_Condition_IO = "Invalid operation";
|
|
static final String DEC_Condition_OV = "Overflow";
|
|
static final String DEC_Condition_PA = "Clamped";
|
|
static final String DEC_Condition_RO = "Rounded";
|
|
static final String DEC_Condition_SU = "Subnormal";
|
|
static final String DEC_Condition_UN = "Underflow";
|
|
static final String DEC_Condition_ZE = "No status";
|
|
static final String DEC_Condition_MU = "Multiple status";
|
|
static final int DEC_Condition_Length = 21; // length of the longest string,
|
|
// including terminator
|
|
}
|