非常小的简单精度和双精度浮点数表示
Very small simple precision and double precision float numbers representation
当我尝试计算一些非常小的简单精度和双精度浮点数时,我遇到了一些问题。
看看下面的代码示例:
public class FloatingLimits {
public static void doSimpleFloatingLimitDemo() {
float firstValue = 1.56F;
float newValue = 1.0F / ((float)Math.pow(2.0D, 150));
double doubleFirst = 2.56;
double doubleNew = 1.0F /Math.pow(2.0D, 150);
double doubleThird = 1.0F/Math.pow(2.0D, 589);
double doubleFourth = 1.0F/Math.pow(2.0, 1589);
System.out.println("float first value =" + firstValue);
System.out.println("float new value =" + newValue);
System.out.println("double first value =" + doubleFirst);
System.out.println("double new value =" + doubleNew);
System.out.println("double third value =" + doubleThird);
System.out.println("double fourth value =" + doubleFourth);
}
public static void main(String[] args) {
doSimpleFloatingLimitDemo();
}
}
它产生以下结果:
因此存在表示问题或显示问题!这与数字精度有什么关系吗?我无法用简单的浮点精度类型(32 位)表示的非常小的数字可以用双浮点精度数字(64 位)表示,但双浮点数也显示出限制。那么对于非常小的数字,这个限制是多少?是否有使用浮点数和双精度数的解决方法,或者我是否应该使用 BigDecimal 来解决它。如果我必须使用 BigDecimals,那么 BigDecimal 表示是否也有一定的限制?
如果您需要以任意精度表示小数,则必须使用 BigDecimal
。
这是一个link
http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
float 和 double 的内部二进制表示可能会引入错误。另一种可能性是使用 int
或 long
将值乘以一个因子(10、100、1000 ...)并将它们视为非十进制值。
如果你看Double.MAX_VALUE
A constant holding the largest positive finite value of type double, (2-2-52).21023.
如果你 运行:
System.out.println(Math.pow(2.0, 1589));
您将看到预期的结果:
Infinity
当我尝试计算一些非常小的简单精度和双精度浮点数时,我遇到了一些问题。
看看下面的代码示例:
public class FloatingLimits {
public static void doSimpleFloatingLimitDemo() {
float firstValue = 1.56F;
float newValue = 1.0F / ((float)Math.pow(2.0D, 150));
double doubleFirst = 2.56;
double doubleNew = 1.0F /Math.pow(2.0D, 150);
double doubleThird = 1.0F/Math.pow(2.0D, 589);
double doubleFourth = 1.0F/Math.pow(2.0, 1589);
System.out.println("float first value =" + firstValue);
System.out.println("float new value =" + newValue);
System.out.println("double first value =" + doubleFirst);
System.out.println("double new value =" + doubleNew);
System.out.println("double third value =" + doubleThird);
System.out.println("double fourth value =" + doubleFourth);
}
public static void main(String[] args) {
doSimpleFloatingLimitDemo();
}
}
它产生以下结果:
因此存在表示问题或显示问题!这与数字精度有什么关系吗?我无法用简单的浮点精度类型(32 位)表示的非常小的数字可以用双浮点精度数字(64 位)表示,但双浮点数也显示出限制。那么对于非常小的数字,这个限制是多少?是否有使用浮点数和双精度数的解决方法,或者我是否应该使用 BigDecimal 来解决它。如果我必须使用 BigDecimals,那么 BigDecimal 表示是否也有一定的限制?
如果您需要以任意精度表示小数,则必须使用 BigDecimal
。
这是一个link
http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
float 和 double 的内部二进制表示可能会引入错误。另一种可能性是使用 int
或 long
将值乘以一个因子(10、100、1000 ...)并将它们视为非十进制值。
如果你看Double.MAX_VALUE
A constant holding the largest positive finite value of type double, (2-2-52).21023.
如果你 运行:
System.out.println(Math.pow(2.0, 1589));
您将看到预期的结果:
Infinity