2013-06-07 7 views
0

У меня возникли проблемы с точностью экспоненциации двойников и их сумм в следующем коде:Удвои и точность кода: что не так?

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-пять сроков выхода являются:

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-значением.

Возможно, что мое условное утверждение неверно, или мне, возможно, придется использовать другой примитивный тип данных ... Спасибо.

ответ

2

Потому что двойная точность имеет точно 53 bits of mantissa.

+0

Что я могу сделать, чтобы исправить свой код? – J0nathan

+1

@ J0nathan: Используйте 'long', или' BigDecimal'/'BigInteger'. –

+0

Спасибо, сэр. – J0nathan

 Смежные вопросы

  • Нет связанных вопросов^_^