rmtogether
asked on
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\
}//end third for
}// end second for
}// end first for
system("pause");
}
ASKER
thanks,
what is "-FLT_MAX" means?
what is "-FLT_MAX" means?
It is the smallest floating point number
ASKER
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,m atrix[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");
}
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.....")----------------
#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\
}//end third for
}// end second for
}// end first for
printf("\n");
printf("max prob is: %.5f\n",max);
printf("they are.....")----------------
system("pause");
}
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
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,
}//end third for
}// end second for
}// end first for
ASKER
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,m atrix[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");
}
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\
}//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,
}//end third for
}// end second for
}// end first for
system("pause");
}
What does not seem to work?
ASKER
there is nothing showing after "they are...."
ASKER
I don't see anything printed from this line
if( max == matrix[i][j]*matrix[j][k] ){ printf("Prob(%d%d%d)\n",i,
ASKER
it works after I change float max = -FLT_MAX; to
double max = -FLT_MAX;
double max = -FLT_MAX;
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); }
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])
ASKER
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,mat rix[i][j]* matrix[j][ k]*0.00000 1), do I still have round off problem?
(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"
A floating-point number (x) is defined by the following model:
x =s * b^e *
p
Σ f[k]*b^−k , emin ≤ e ≤ 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
x =s * b^e *
p
Σ f[k]*b^−k , emin ≤ e ≤ 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
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
#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\
}//end third for
}// end second for
}// end first for
system("pause");
}