float
变量的每个可能值都可以精确地表示在double
变量中吗?
换句话说,对于所有可能的值X
,以下内容将成功:
float f1 = X; double d = f1; float f2 = (float)d; if(f1 == f2) System.out.println("Success!"); else System.out.println("Failure!");
我怀疑是没有例外,或者只有边缘情况(如+/-无穷大或NaN).
编辑:问题的原始措辞令人困惑(陈述两种方式,一种是回答"否",另一种方式对同一答案回答"是").我已经对它进行了重写,以便与问题标题相匹配.
是.
通过列举所有可能的案例证明:
public class TestDoubleFloat { public static void main(String[] args) { for (long i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++) { float f1 = Float.intBitsToFloat((int) i); double d = (double) f1; float f2 = (float) d; if (f1 != f2) { if (Float.isNaN(f1) && Float.isNaN(f2)) { continue; // ok, NaN } fail("oops: " + f1 + " != " + f2); } } } }
在我的机器上完成12秒钟.32位很小.
从理论上讲,没有这样的值,所以"是",每个浮点数应该可以表示为double.从float转换为double应该只涉及在末尾添加四个字节00 - 它们是使用相同的格式,只是使用不同大小的字段.
是的,浮点数是双打的子集。浮点数和双精度数都具有形式(符号* a * 2 ^ b)。浮点数和双精度数之间的区别是a和b中的位数。由于双精度型有更多位可用,因此为双精度型分配浮点值实际上意味着插入额外的0位。