【问题标题】:Doubles and Code Accuracy: What Is Wrong?双打和代码准确性:有什么问题?
【发布时间】:2013-06-03 04:12:16
【问题描述】:

我在以下代码中对双精度数及其总和的求幂精度有疑问:

public static void main(String[] args) {

    for(double A = 1; A <= 100; A++)
    {
        for(double B = 1; B <= 100; B++)
        {
            for(double C = 1; C <= 100; C++)
            {
                for(double x = 3; x <= 100; x++)
                {
                    for(double y = 3; y <= 100; y++)
                    {
                        for(double z = 3; z <= 100; z++)
                        {
                            if((Math.pow(A, x) + Math.pow(B, y)) == (Math.pow(C, z)))
                            {
                                System.out.println(A+"^"+x+" + "+B+"^"+y+" = "+C+"^"+z);
                            }
                        }
                    }
                }
            }
        }
    }

}

其中输出的前五项是:

1.0^3.0 + 2.0^53.0 = 2.0^53.0
1.0^3.0 + 2.0^54.0 = 2.0^54.0
1.0^3.0 + 2.0^55.0 = 2.0^55.0
1.0^3.0 + 2.0^56.0 = 2.0^56.0
1.0^3.0 + 2.0^57.0 = 2.0^57.0

很明显,将“1.0^3.0”(基本上是“1.0”)与“2.0^53.0”相加 NOT 等于“2.0^53.0”; y值也有问题。

可能是我的条件语句有缺陷,或者我可能不得不使用不同的原始数据类型...谢谢。

【问题讨论】:

    标签: math double primitive exponentiation


    【解决方案1】:

    因为双精度正好有53 bits of mantissa

    【讨论】:

    • @J0nathan:使用long,或BigDecimal/BigInteger
    猜你喜欢
    • 2011-06-05
    • 2011-09-12
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多