繁体   English   中英

Float vs double Math Java

[英]Float vs double Math Java

以下是否存在精度差异(假设a和b的值可以在浮点数中表示而不会丢失精度)。

有花车:

float a;
float b;
double result = 1 + a*b;

双打:

double a;
double b;
double result = 1 + a*b;

简单的例子:

float a = 16777217;  // Largest int exactly representable in a float.
float b = 16777217;
System.out.println((double)(1 + a*b));

double c = 16777217;
double d = 16777217;
System.out.println(1 + c*d);

输出( Ideone ):

2.81474976710656E14
2.8147501026509E14

所以是的,使用float导致精度下降。

精度有所下降

float a;
float b;
double result = 1 + a*b;
  • float表示。
  • ab的产品,也是float 注意: a * bfloat
  • 1的加法可能导致精度损失。

应该a * b可能会失去更多精度

for (int i = 1; i < 100; i += 2) {
    float a = i;
    float b = 1.0f / i;
    if ((double) a * b != a * b && a * b != 1)
        System.out.println(i + " " + (double) a * b + " " + a * b);
}

版画

41 0.999999962747097 0.99999994
47 0.9999999683350325 0.99999994
55 0.9999999683350325 0.99999994
61 0.9999999441206455 0.99999994
83 0.999999962747097 0.99999994
97 0.999999969266355 0.99999994

注意:它也可能发生恢复精度丢失并在b精度丢失后得到正确的答案

for (int i = 1; i < 20; i += 2) {
    float a = i;
    float b = 1.0f / i;
    if (b != 1.0 / i && a * b == 1)
        System.out.println(i + " " + (double) a * b + " " + a * b);
}

版画

3 1.0000000298023224 1.0
5 1.0000000149011612 1.0
7 1.0000000447034836 1.0
9 1.0000000074505806 1.0
11 1.0000000298023224 1.0
13 1.000000037252903 1.0
15 1.0000000521540642 1.0
17 1.0000000037252903 1.0
19 1.0000000074505806 1.0

当您将其评估为浮点数和双精度数时,a * b部分可能会出现精度差异的损失。 所以是的,有了一些值,第二个会更准确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM