每个浮点数都可以精确地表示为双精度值吗?

2022-09-02 11:54:51

变量的每个可能值都可以在变量中精确表示吗?floatdouble

换句话说,对于所有可能的值,以下操作将成功:X

float f1 = X;
double d = f1;
float f2 = (float)d;

if(f1 == f2)
  System.out.println("Success!");
else
  System.out.println("Failure!");

我的怀疑是没有例外,或者如果有,它只适用于边缘情况(如+/-无穷大或NaN)。

编辑:问题的原始措辞令人困惑(陈述两种方式,一种方式将回答“否”,另一种方式将回答“是”以获得相同的答案)。我重新措辞,使其与问题标题相匹配。


答案 1

是的。

通过列举所有可能的情况来证明:

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 位很小


答案 2

从理论上讲,没有这样的值,所以“是”,每个浮点数都应该可以表示为双精度。从浮点型转换为双精度型应该只涉及在末尾添加四个00字节 - 它们使用相同的格式存储,只是具有不同大小的字段。