2017-01-15 4 views
3

Я пытаюсь реализовать следующее уравнение, но не показывать точное значение.показывает неправильное значение из уравнения

Предположим, что значение data1 к data9 являются: 5,1,1,1,2,1,3,1,1 и значение у будет 2. но показывающий null.original ссылку уравнение: https://www.researchgate.net/publication/303232034_Mathematical_Model_Development_to_Detect_Breast_Cancer_Using_Multigene_Genetic_Programming

double term3 =Math.cos(Math.log10(data7))/(data6+data7-6.419); 



double y=0.05321*Math.log10(Math.exp(data2-1.0*Math.sin(Math.cos(data8))+Math.cos(data6)-(1.0*data6)/(data1*data3*data9*Math.sin(data8)*Math.tanh(data8))))-1.573*Math.sin(Math.sqrt(data4+data6+term3)) 
      -0.07468*Math.sin(Math.exp(data2*data9)) 
      -0.9181*Math.log10(2.0*data4+data6+Math.sin(Math.tanh(data7)+5.626*data4*data9)+Math.sin(Math.sin(Math.sin(data8))) 
      +Math.sin(Math.sin(2.0*data6-7.128))+(Math.cos(data4)/(data6+data7-6.649))+(Math.cos(data4)/(data6+data7-6.634))+(Math.cos(data4)/(data4*(2.0*data6-1.479)))) 
      +0.2919*Math.sin(Math.sin(Math.cos(data2+data5+data8)/data2+data7-6.76)) 
      -0.07468*Math.sin(Math.sqrt(2.0*data4+data7-1.0*Math.sqrt(data6))) 
      -0.07468*Math.sin(data6)-((5.381*Math.pow(10, 15)*Math.cos(Math.sqrt(data2*Math.pow(data3, 2))))/(7.206*Math.pow(10, 16)*data3+7.206*Math.pow(10, 16)*data5-4.934*Math.pow(10, 17))) 
      -((5.381*Math.pow(10, 15)*Math.cos(Math.sqrt(data1*data3*data4)))/(7.206*Math.pow(10, 16)*data5+Math.sqrt(Math.tanh(data7))*(data7-1.0*data4+7.206*Math.pow(10, 16)*Math.cos(data6))-4.836*Math.pow(10, 17))) 
      +((5.258*Math.pow(10, 15)*Math.cos(data4))/(1.801*Math.pow(10, 16)*data2+1.801*Math.pow(10, 16)*data7-1.2*Math.pow(10, 17))) 
      +(0.4014*Math.cos(data6+data7)+Math.sqrt(data7+5.446))/((data5+Math.log10(data1)-6.585)*(Math.log10(data7)-1.0*Math.tanh(data5)-5.646*data4*data9) 
      +Math.sqrt(Math.tanh(data8))*(data7-1.0*data4+Math.cos(data6))+data2*Math.pow(data4, 2)*Math.cos(data2)*Math.cos(data6))-0.003903*data1*Math.cos(Math.sqrt(data2+data4+data6-1.0*Math.sqrt(data4)))*(
      3.057*data1+2.0*data2-1.0*data4+data6+data7+data9+Math.cos(6.478*data6)+Math.cos(data6)-1.0*Math.sqrt(data1*data3*data6)-6.419)+((0.2919*Math.cos(Math.sqrt(data1*data3*data6)))/(2.0*data6-7.218)*(data5+data7-6.76))+5.235; 

значение у должно быть 2 или 4 .Но он не intering в случае еще условие

int x= (int) y; 

     if(x==2) 
     { 
      condition="B"; 
      Toast.makeText(getApplicationContext(),"value of x is "+x,Toast.LENGTH_LONG).show(); 
     } 
     else if(x==4) 
     { 
      condition="M"; 
      Toast.makeText(getApplicationContext(),"value of x is "+x,Toast.LENGTH_LONG).show(); 
     } 

можите понять, где проблема .... помогите пожалуйста .. .

+0

уверены, что каждый int правильный в ур-уравнении? – W4R10CK

+0

Каково значение x и y при их печати? –

ответ

3

Поскольку y - это double, расчеты крайне маловероятны, чтобы дать ровно 2 или 4. Что, вероятно, происходит, так это то, что y - это маленький бит меньше 2 или 4, когда первое условие выходит из строя.

Вместо литья y непосредственно на номер int, вы можете попробовать long x = Math.round(y);. Альтернативно (и, возможно, лучше) просто проверьте, что Math.abs(y - 2) или Math.abs(y - 4) меньше некоторого небольшого порога (например, .0001), чтобы обеспечить возможную ошибку округления.

+0

Он бросает его в инт. Поэтому он действительно проверяет, есть ли x = [2.0, 2.999999999] или x = [4.0,4.999999999]. Поэтому его, вероятно, слишком разрешительный на верхнем конце и недостаточно ниже (1.999999999 потерпит неудачу, но в основном 2). –

+0

@GabeSechan - Точно. Вот почему я думаю, что проблема заключается в том, что 'y' заканчивается маленьким битом, меньшим, чем 2 или 4 (любой из них приведет к сбою ветвей' if' и 'else'). –