• C

find max value after some calculation




#include <stdio.h>


float matrix [3][3]={{0.5,0.25,0.25},
                     {0.375,0.125,0.375},
                     {0.125,0.675,0.375}};

main (){
    int i,j,k;

     for (i=0; i<3; i++){
          printf("\n");
         for (j=0; j<3; j++) {
             printf("\n");
            for (k=0; k<3; k++){
              printf("Prob(%d%d%d)=%.5f\n",i,j,k,matrix[i][j]*matrix[j][k]);   ------------>? how to find max value
           
            }//end third for
                       
        }// end second for
    }// end first for


    system("pause");
}
rmtogetherAsked:
Who is Participating?
 
ozoConnect With a Mentor Commented:
if you change matrix to long, matrix[i][j]*matrix[j][k] will not have a round off problem (although there could be an overflow problem)
matrix[i][j]*matrix[j][k]*0.000001 could have a round off problem, since 0.000001 might really be
0.000000999999997475242707878351 or 0.000000999999999999999954748112


0
 
ozoCommented:

#include <stdio.h>
#include <float.h>


float matrix [3][3]={{0.5,0.25,0.25},
                     {0.375,0.125,0.375},
                     {0.125,0.675,0.375}};

main (){
    int i,j,k;
    float max = -FLT_MAX;

     for (i=0; i<3; i++){
          printf("\n");
         for (j=0; j<3; j++) {
             printf("\n");
            for (k=0; k<3; k++){
   
               if( max < matrix[i][j]*matrix[j][k] ){ max = matrix[i][j]*matrix[j][k]; }
              printf("Prob(%d%d%d)=%.5f\n",i,j,k,matrix[i][j]*matrix[j][k]);   ------------>? how to find max valu
           
            }//end third for
                       
        }// end second for
    }// end first for


    system("pause");
}
0
 
rmtogetherAuthor Commented:
thanks,

what is "-FLT_MAX" means?
0
The IT Degree for Career Advancement

Earn your B.S. in Network Operations and Security and become a network and IT security expert. This WGU degree program curriculum was designed with tech-savvy, self-motivated students in mind – allowing you to use your technical expertise, to address real-world business problems.

 
ozoCommented:
It is the smallest floating point number
0
 
rmtogetherAuthor Commented:
thanks,

Can I ask you the last question? Since the max value is happen in more than one pleace, can I print a list of them?

for example,
in this program, the max value  is 0.25313 and happen in Prob (121), prob (210), prob(221). I would like have an end summary to show something like

   printf("max prob is: %.5f\n",max);
   printf("they are.....")---------------------------------? list of item has max value





#include <stdio.h>
#include <float.h>


float matrix [3][3]={{0.5,0.25,0.25},
                     {0.375,0.125,0.375},
                     {0.125,0.675,0.375}};

main (){
    int i,j,k;
    float max = -FLT_MAX;

     for (i=0; i<3; i++){
          printf("\n");
         for (j=0; j<3; j++) {
             printf("\n");
            for (k=0; k<3; k++){
   
               if( max < matrix[i][j]*matrix[j][k] ) {max = matrix[i][j]*matrix[j][k];
               }
                 printf("Prob(%d%d%d)=%.5f\n",i,j,k,matrix[i][j]*matrix[j][k]);  
           
            }//end third for
                       
        }// end second for
    }// end first for
   
   printf("\n");
   printf("max prob is: %.5f\n",max);
   printf("they are.....")---------------------------------? list of item has max value

    system("pause");
}
0
 
ozoCommented:
It's generally not safe to rely on floating point to be the same when they happen in more than one place but in this case, all the values in your matrix are dyadic rationals, which can be exactly represented in floating point numbers when FLT_RADIX==2

      
   printf("max prob is: %.5f\n",max);
   printf("they are.....")
     for (i=0; i<3; i++){
         for (j=0; j<3; j++) {
            for (k=0; k<3; k++){
   
               if( max == matrix[i][j]*matrix[j][k] ){  printf("Prob(%d%d%d)\n",i,j,k);  }
           
            }//end third for
                       
        }// end second for
    }// end first for
   
0
 
rmtogetherAuthor Commented:
hi, ozo

I put the code like below, but seems not work.. could you help me about it?

#include <stdio.h>
#include <float.h>


float matrix [3][3]={{0.5,0.25,0.25},
                     {0.375,0.125,0.375},
                     {0.125,0.675,0.375}};

main (){
    int i,j,k;
    float max = -FLT_MAX;

     for (i=0; i<3; i++){
          printf("\n");
         for (j=0; j<3; j++) {
             printf("\n");
            for (k=0; k<3; k++){
   
               if( max < matrix[i][j]*matrix[j][k] ) {max = matrix[i][j]*matrix[j][k];
               }
                 printf("Prob(%d%d%d)=%.5f\n",i,j,k,matrix[i][j]*matrix[j][k]);  
           
            }//end third for
                       
        }// end second for
    }// end first for
   
   
   printf("max prob is: %.5f\n",max);
   printf("they are.....");
     for (i=0; i<3; i++){
         for (j=0; j<3; j++) {
            for (k=0; k<3; k++){
   
               if( max == matrix[i][j]*matrix[j][k] ){  printf("Prob(%d%d%d)\n",i,j,k);  }
           
            }//end third for
                       
        }// end second for
    }// end first for

    system("pause");
}
0
 
ozoCommented:
What does not seem to work?
0
 
rmtogetherAuthor Commented:
there is  nothing showing after "they are...."
0
 
rmtogetherAuthor Commented:

I don't see anything printed from this line

   if( max == matrix[i][j]*matrix[j][k] ){  printf("Prob(%d%d%d)\n",i,j,k);  }
0
 
rmtogetherAuthor Commented:
it works after I change  float max = -FLT_MAX; to

double max = -FLT_MAX;
0
 
ozoCommented:
This looks like an instance of the dangers of comparing floating point numbers for equality.
As I look more carefully at
float matrix [3][3]={{0.5,0.25,0.25},
                     {0.375,0.125,0.375},
                     {0.125,0.675,0.375}};
I see that you have 0.675 which is not represented exactly in floating point numbers with FLT_RADIX==2
instead of 0.625 which could have been represented exactly, so there could be round off errors that keep the comparison from being exact.

one way to handle it would be to use exact integer arithmetic with
long matrix [3][3]={{500,250,250},
                     {375,125,375},
                     {125,675,375}};
or to have some error tolerance
like
epsilon=0.0001;
 if( fabs(max - matrix[i][j]*matrix[j][k]) < epsilon ){  printf("Prob(%d%d%d)\n",i,j,k);  }


0
 
rmtogetherAuthor Commented:
thanks,

(1) what does FLT_RADIX==2 means?
(2) if I change matrix to long and make
     printf to printf("Prob(%d%d%d)=%f\n",i,j,k,matrix[i][j]*matrix[j][k]*0.000001), do I still have round off problem?
0
 
ozoCommented:
A floating-point number (x) is defined by the following model:

x =s * b^e *
p
&#931; f[k]*b^&#8722;k , emin &#8804; e &#8804; emax
k=1

s sign (±1)
b base or radix of exponent representation (an integer > 1)
e exponent (an integer between a minimum emin and a maximum
p precision (the number of base-b digits in the significand)
f[k] nonnegative integers less than b (the significand digits)

FLT_RADIX represents b
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.