当前位置:  开发笔记 > 编程语言 > 正文

每个浮点数都可以完全表示为双精度数吗?

如何解决《每个浮点数都可以完全表示为双精度数吗?》经验,为你挑选了3个好方法。

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).

编辑:问题的原始措辞令人困惑(陈述两种方式,一种是回答"否",另一种方式对同一答案回答"是").我已经对它进行了重写,以便与问题标题相匹配.



1> mfx..:

是.

通过列举所有可能的案例证明:

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


它通过枚举所有整数(具有相同大小)并将其位模式转换为浮点来枚举所有可能的浮点数.
如果(浮点)"INF"被解释为"计算超过2 ^ 127",则没有等价的"double".将这样的`float`值转换为`double`将产生"超过2 ^ 1023的计算".只有数百或数量级.

2> James Curran..:

从理论上讲,没有这样的值,所以"是",每个浮点数应该可以表示为double.从float转换为double应该只涉及在末尾添加四个字节0​​0 - 它们是使用相同的格式,只是使用不同大小的字段.



3> MSalters..:

是的,浮点数是双打的子集。浮点数和双精度数都具有形式(符号* a * 2 ^ b)。浮点数和双精度数之间的区别是a和b中的位数。由于双精度型有更多位可用,因此为双精度型分配浮点值实际上意味着插入额外的0位。

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有