Home > OS >  printf wrong on floating point
printf wrong on floating point

Time:01-21

I definitely cant figure it out. Printing sum gives a wrong value. If the comment on in-the-loop printf is removed everything works as expected. If const float values[] is declared inside the main body, printf again behaves normally. Why is this happening?

/* blah */

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

/* declare 1000 elements array*/
const float values[] = {
    1.000000F, 1.259921F, 1.442250F, 1.587401F, 1.709976F, 1.817121F, 
    1.912931F, 2.000000F, 2.080084F, 2.154435F, 2.223980F, 2.289428F, 
    2.351335F, 2.410142F, 2.466212F, 2.519842F, 2.571282F, 2.620741F, 
    2.668402F, 2.714418F, 2.758924F, 2.802039F, 2.843867F, 2.884499F, 
    2.924018F, 2.962496F, 3.000000F, 3.036589F, 3.072317F, 3.107233F, 
    3.141381F, 3.174802F, 3.207534F, 3.239612F, 3.271066F, 3.301927F, 
    3.332222F, 3.361975F, 3.391211F, 3.419952F, 3.448217F, 3.476027F, 
    3.503398F, 3.530348F, 3.556893F, 3.583048F, 3.608826F, 3.634241F, 
    3.659306F, 3.684031F, 3.708430F, 3.732511F, 3.756286F, 3.779763F, 
    3.802953F, 3.825862F, 3.848501F, 3.870877F, 3.892997F, 3.914868F, 
    3.936497F, 3.957892F, 3.979057F, 4.000000F, 4.020726F, 4.041240F, 
    4.061548F, 4.081655F, 4.101566F, 4.121285F, 4.140818F, 4.160168F, 
    4.179339F, 4.198337F, 4.217164F, 4.235824F, 4.254321F, 4.272659F, 
    4.290840F, 4.308869F, 4.326749F, 4.344481F, 4.362071F, 4.379519F, 
    4.396830F, 4.414005F, 4.431048F, 4.447960F, 4.464745F, 4.481405F, 
    4.497941F, 4.514358F, 4.530655F, 4.546836F, 4.562902F, 4.578857F, 
    4.594701F, 4.610436F, 4.626065F, 4.641589F, 4.657010F, 4.672329F, 
    4.687548F, 4.702669F, 4.717694F, 4.732624F, 4.747459F, 4.762203F, 
    4.776856F, 4.791420F, 4.805895F, 4.820284F, 4.834588F, 4.848808F, 
    4.862944F, 4.876999F, 4.890973F, 4.904868F, 4.918684F, 4.932424F, 
    4.946087F, 4.959676F, 4.973190F, 4.986631F, 5.000000F, 5.013298F, 
    5.026525F, 5.039684F, 5.052774F, 5.065797F, 5.078753F, 5.091643F, 
    5.104469F, 5.117230F, 5.129928F, 5.142563F, 5.155137F, 5.167649F, 
    5.180101F, 5.192494F, 5.204828F, 5.217103F, 5.229321F, 5.241483F, 
    5.253588F, 5.265637F, 5.277632F, 5.289572F, 5.301459F, 5.313293F, 
    5.325074F, 5.336803F, 5.348481F, 5.360108F, 5.371686F, 5.383213F, 
    5.394691F, 5.406120F, 5.417501F, 5.428835F, 5.440122F, 5.451362F, 
    5.462555F, 5.473704F, 5.484807F, 5.495864F, 5.506878F, 5.517848F, 
    5.528775F, 5.539658F, 5.550499F, 5.561298F, 5.572055F, 5.582770F, 
    5.593445F, 5.604079F, 5.614672F, 5.625226F, 5.635741F, 5.646216F, 
    5.656653F, 5.667051F, 5.677411F, 5.687734F, 5.698020F, 5.708268F, 
    5.718479F, 5.728654F, 5.738793F, 5.748897F, 5.758965F, 5.768998F, 
    5.778996F, 5.788960F, 5.798890F, 5.808786F, 5.818648F, 5.828476F, 
    5.838273F, 5.848035F, 5.857766F, 5.867464F, 5.877131F, 5.886765F, 
    5.896369F, 5.905941F, 5.915482F, 5.924992F, 5.934472F, 5.943922F, 
    5.953342F, 5.962732F, 5.972093F, 5.981424F, 5.990726F, 6.000000F, 
    6.009245F, 6.018462F, 6.027650F, 6.036811F, 6.045944F, 6.055049F, 
    6.064127F, 6.073178F, 6.082202F, 6.091199F, 6.100170F, 6.109115F, 
    6.118033F, 6.126926F, 6.135792F, 6.144634F, 6.153450F, 6.162240F, 
    6.171006F, 6.179747F, 6.188463F, 6.197155F, 6.205822F, 6.214465F, 
    6.223084F, 6.231680F, 6.240252F, 6.248800F, 6.257325F, 6.265827F, 
    6.274305F, 6.282762F, 6.291194F, 6.299605F, 6.307993F, 6.316360F, 
    6.324704F, 6.333025F, 6.341326F, 6.349604F, 6.357861F, 6.366097F, 
    6.374311F, 6.382504F, 6.390676F, 6.398828F, 6.406959F, 6.415069F, 
    6.423158F, 6.431228F, 6.439277F, 6.447306F, 6.455315F, 6.463304F, 
    6.471273F, 6.479224F, 6.487154F, 6.495065F, 6.502957F, 6.510830F, 
    6.518684F, 6.526519F, 6.534335F, 6.542133F, 6.549911F, 6.557672F, 
    6.565414F, 6.573139F, 6.580844F, 6.588532F, 6.596202F, 6.603855F, 
    6.611489F, 6.619106F, 6.626706F, 6.634287F, 6.641852F, 6.649400F, 
    6.656930F, 6.664443F, 6.671940F, 6.679420F, 6.686883F, 6.694330F, 
    6.701759F, 6.709173F, 6.716570F, 6.723951F, 6.731316F, 6.738664F, 
    6.745996F, 6.753314F, 6.760614F, 6.767900F, 6.775169F, 6.782423F, 
    6.789661F, 6.796884F, 6.804092F, 6.811285F, 6.818462F, 6.825624F, 
    6.832771F, 6.839904F, 6.847021F, 6.854124F, 6.861212F, 6.868285F, 
    6.875344F, 6.882389F, 6.889419F, 6.896435F, 6.903436F, 6.910423F, 
    6.917397F, 6.924356F, 6.931301F, 6.938232F, 6.945149F, 6.952053F, 
    6.958943F, 6.965820F, 6.972682F, 6.979532F, 6.986368F, 6.993191F, 
    7.000000F, 7.006796F, 7.013579F, 7.020349F, 7.027106F, 7.033850F, 
    7.040581F, 7.047298F, 7.054004F, 7.060697F, 7.067377F, 7.074044F, 
    7.080698F, 7.087341F, 7.093971F, 7.100588F, 7.107193F, 7.113787F, 
    7.120368F, 7.126936F, 7.133492F, 7.140037F, 7.146570F, 7.153090F, 
    7.159599F, 7.166096F, 7.172581F, 7.179055F, 7.185516F, 7.191967F, 
    7.198405F, 7.204832F, 7.211248F, 7.217652F, 7.224045F, 7.230427F, 
    7.236797F, 7.243156F, 7.249505F, 7.255841F, 7.262167F, 7.268482F, 
    7.274786F, 7.281080F, 7.287362F, 7.293633F, 7.299894F, 7.306144F, 
    7.312383F, 7.318612F, 7.324830F, 7.331037F, 7.337234F, 7.343421F, 
    7.349597F, 7.355762F, 7.361917F, 7.368063F, 7.374198F, 7.380323F, 
    7.386437F, 7.392542F, 7.398636F, 7.404721F, 7.410795F, 7.416860F, 
    7.422914F, 7.428959F, 7.434994F, 7.441019F, 7.447034F, 7.453040F, 
    7.459036F, 7.465022F, 7.470999F, 7.476966F, 7.482924F, 7.488873F, 
    7.494811F, 7.500741F, 7.506661F, 7.512571F, 7.518473F, 7.524365F, 
    7.530248F, 7.536122F, 7.541987F, 7.547843F, 7.553689F, 7.559526F, 
    7.565355F, 7.571174F, 7.576985F, 7.582787F, 7.588579F, 7.594363F, 
    7.600139F, 7.605905F, 7.611663F, 7.617412F, 7.623152F, 7.628884F, 
    7.634607F, 7.640321F, 7.646027F, 7.651725F, 7.657414F, 7.663095F, 
    7.668766F, 7.674430F, 7.680086F, 7.685733F, 7.691372F, 7.697002F, 
    7.702625F, 7.708239F, 7.713845F, 7.719443F, 7.725032F, 7.730614F, 
    7.736187F, 7.741753F, 7.747311F, 7.752861F, 7.758402F, 7.763936F, 
    7.769462F, 7.774980F, 7.780490F, 7.785993F, 7.791488F, 7.796975F, 
    7.802454F, 7.807925F, 7.813389F, 7.818845F, 7.824294F, 7.829735F, 
    7.835169F, 7.840595F, 7.846013F, 7.851424F, 7.856828F, 7.862224F, 
    7.867613F, 7.872994F, 7.878368F, 7.883735F, 7.889094F, 7.894447F, 
    7.899792F, 7.905129F, 7.910460F, 7.915783F, 7.921099F, 7.926408F, 
    7.931710F, 7.937006F, 7.942293F, 7.947574F, 7.952847F, 7.958115F, 
    7.963374F, 7.968627F, 7.973873F, 7.979112F, 7.984344F, 7.989570F, 
    7.994788F, 8.000000F, 8.005205F, 8.010403F, 8.015594F, 8.020780F, 
    8.025957F, 8.031129F, 8.036293F, 8.041451F, 8.046603F, 8.051748F, 
    8.056887F, 8.062018F, 8.067143F, 8.072262F, 8.077374F, 8.082480F, 
    8.087580F, 8.092672F, 8.097759F, 8.102839F, 8.107913F, 8.112981F, 
    8.118042F, 8.123096F, 8.128145F, 8.133187F, 8.138223F, 8.143252F, 
    8.148276F, 8.153294F, 8.158305F, 8.163310F, 8.168309F, 8.173302F, 
    8.178288F, 8.183270F, 8.188244F, 8.193213F, 8.198175F, 8.203132F, 
    8.208082F, 8.213027F, 8.217966F, 8.222898F, 8.227825F, 8.232746F, 
    8.237661F, 8.242571F, 8.247474F, 8.252372F, 8.257263F, 8.262149F, 
    8.267030F, 8.271904F, 8.276772F, 8.281635F, 8.286492F, 8.291345F, 
    8.296190F, 8.301030F, 8.305865F, 8.310694F, 8.315517F, 8.320335F, 
    8.325148F, 8.329954F, 8.334755F, 8.339551F, 8.344341F, 8.349126F, 
    8.353905F, 8.358678F, 8.363446F, 8.368210F, 8.372967F, 8.377719F, 
    8.382465F, 8.387206F, 8.391942F, 8.396673F, 8.401399F, 8.406118F, 
    8.410832F, 8.415542F, 8.420246F, 8.424945F, 8.429638F, 8.434327F, 
    8.439010F, 8.443687F, 8.448360F, 8.453028F, 8.457690F, 8.462348F, 
    8.467000F, 8.471647F, 8.476289F, 8.480927F, 8.485559F, 8.490185F, 
    8.494806F, 8.499423F, 8.504035F, 8.508642F, 8.513244F, 8.517840F, 
    8.522432F, 8.527019F, 8.531601F, 8.536178F, 8.540750F, 8.545318F, 
    8.549880F, 8.554437F, 8.558990F, 8.563538F, 8.568081F, 8.572618F, 
    8.577152F, 8.581680F, 8.586205F, 8.590724F, 8.595238F, 8.599748F, 
    8.604252F, 8.608752F, 8.613248F, 8.617739F, 8.622225F, 8.626706F, 
    8.631183F, 8.635654F, 8.640122F, 8.644586F, 8.649044F, 8.653498F, 
    8.657947F, 8.662391F, 8.666831F, 8.671267F, 8.675697F, 8.680123F, 
    8.684546F, 8.688963F, 8.693376F, 8.697784F, 8.702188F, 8.706588F, 
    8.710982F, 8.715373F, 8.719760F, 8.724141F, 8.728518F, 8.732891F, 
    8.737260F, 8.741625F, 8.745985F, 8.750340F, 8.754691F, 8.759038F, 
    8.763381F, 8.767719F, 8.772053F, 8.776383F, 8.780708F, 8.785029F, 
    8.789347F, 8.793659F, 8.797968F, 8.802272F, 8.806572F, 8.810868F, 
    8.815160F, 8.819448F, 8.823730F, 8.828011F, 8.832285F, 8.836555F, 
    8.840822F, 8.845085F, 8.849344F, 8.853599F, 8.857849F, 8.862096F, 
    8.866338F, 8.870576F, 8.874810F, 8.879040F, 8.883266F, 8.887488F, 
    8.891706F, 8.895921F, 8.900130F, 8.904337F, 8.908539F, 8.912737F, 
    8.916931F, 8.921122F, 8.925307F, 8.929490F, 8.933668F, 8.937843F, 
    8.942014F, 8.946180F, 8.950344F, 8.954503F, 8.958658F, 8.962810F, 
    8.966957F, 8.971101F, 8.975241F, 8.979377F, 8.983509F, 8.987638F, 
    8.991762F, 8.995883F, 9.000000F, 9.004113F, 9.008223F, 9.012329F, 
    9.016431F, 9.020529F, 9.024624F, 9.028715F, 9.032803F, 9.036886F, 
    9.040966F, 9.045042F, 9.049114F, 9.053183F, 9.057248F, 9.061310F, 
    9.065368F, 9.069422F, 9.073473F, 9.077519F, 9.081563F, 9.085603F, 
    9.089639F, 9.093672F, 9.097701F, 9.101727F, 9.105748F, 9.109767F, 
    9.113782F, 9.117793F, 9.121801F, 9.125805F, 9.129807F, 9.133803F, 
    9.137797F, 9.141788F, 9.145775F, 9.149757F, 9.153737F, 9.157714F, 
    9.161687F, 9.165657F, 9.169622F, 9.173585F, 9.177545F, 9.181500F, 
    9.185452F, 9.189402F, 9.193348F, 9.197289F, 9.201228F, 9.205164F, 
    9.209096F, 9.213025F, 9.216950F, 9.220873F, 9.224792F, 9.228706F, 
    9.232618F, 9.236527F, 9.240434F, 9.244335F, 9.248235F, 9.252130F, 
    9.256022F, 9.259912F, 9.263797F, 9.267680F, 9.271559F, 9.275435F, 
    9.279308F, 9.283177F, 9.287045F, 9.290907F, 9.294767F, 9.298624F, 
    9.302478F, 9.306328F, 9.310175F, 9.314019F, 9.317860F, 9.321697F, 
    9.325532F, 9.329364F, 9.333192F, 9.337017F, 9.340838F, 9.344658F, 
    9.348474F, 9.352285F, 9.356095F, 9.359901F, 9.363705F, 9.367505F, 
    9.371303F, 9.375096F, 9.378887F, 9.382675F, 9.386460F, 9.390242F, 
    9.394021F, 9.397797F, 9.401569F, 9.405338F, 9.409105F, 9.412869F, 
    9.416630F, 9.420387F, 9.424142F, 9.427894F, 9.431643F, 9.435388F, 
    9.439131F, 9.442870F, 9.446608F, 9.450341F, 9.454072F, 9.457800F, 
    9.461525F, 9.465247F, 9.468966F, 9.472682F, 9.476396F, 9.480106F, 
    9.483813F, 9.487518F, 9.491220F, 9.494919F, 9.498615F, 9.502308F, 
    9.505998F, 9.509686F, 9.513370F, 9.517052F, 9.520730F, 9.524406F, 
    9.528079F, 9.531750F, 9.535418F, 9.539082F, 9.542744F, 9.546403F, 
    9.550058F, 9.553712F, 9.557364F, 9.561010F, 9.564656F, 9.568298F, 
    9.571938F, 9.575575F, 9.579208F, 9.582840F, 9.586468F, 9.590094F, 
    9.593717F, 9.597338F, 9.600955F, 9.604569F, 9.608182F, 9.611791F, 
    9.615397F, 9.619001F, 9.622602F, 9.626202F, 9.629798F, 9.633390F, 
    9.636981F, 9.640569F, 9.644155F, 9.647737F, 9.651317F, 9.654894F, 
    9.658468F, 9.662040F, 9.665609F, 9.669176F, 9.672740F, 9.676302F, 
    9.679860F, 9.683416F, 9.686971F, 9.690521F, 9.694070F, 9.697616F, 
    9.701159F, 9.704699F, 9.708237F, 9.711772F, 9.715305F, 9.718835F, 
    9.722363F, 9.725888F, 9.729411F, 9.732931F, 9.736448F, 9.739964F, 
    9.743476F, 9.746985F, 9.750493F, 9.753998F, 9.757501F, 9.761000F, 
    9.764498F, 9.767992F, 9.771484F, 9.774974F, 9.778461F, 9.781946F, 
    9.785429F, 9.788909F, 9.792386F, 9.795861F, 9.799334F, 9.802804F, 
    9.806272F, 9.809736F, 9.813199F, 9.816659F, 9.820117F, 9.823572F, 
    9.827025F, 9.830476F, 9.833924F, 9.837369F, 9.840813F, 9.844254F, 
    9.847692F, 9.851128F, 9.854562F, 9.857993F, 9.861422F, 9.864848F, 
    9.868272F, 9.871695F, 9.875113F, 9.878531F, 9.881945F, 9.885357F, 
    9.888767F, 9.892175F, 9.895580F, 9.898983F, 9.902384F, 9.905782F, 
    9.909178F, 9.912571F, 9.915962F, 9.919352F, 9.922738F, 9.926123F, 
    9.929504F, 9.932884F, 9.936261F, 9.939636F, 9.943009F, 9.946380F, 
    9.949748F, 9.953114F, 9.956477F, 9.959839F, 9.963198F, 9.966555F, 
    9.969910F, 9.973262F, 9.976612F, 9.979959F, 9.983305F, 9.986649F, 
    9.989990F, 9.993329F, 9.996666F };

int main (void)
{

    float sum = 0.0F;
    int r;
    
    for (int i = 0 ; i < 10000000; i  )
    {
        r = rand()00;
        sum  = values[r];
        //printf("%f, %f, %d\n",sum, values[r], r);
    }
    printf("bytes: %ld\n", sizeof(sum));
    printf("Floatmax: %f\n", FLT_MAX);
    printf("Result: %f\n", sum);
        
    return 0;
}

CodePudding user response:

Add srand(time(NULL)); before the loop.

Then every time you run the program sum will be different.

At the moment every time you run the program the "random" numbers sequence is exactly the same.

Also you access the array outside the bounds and it is undefined behaviour.

r = rand()%(sizeof(values)/sizeof(values[0]));

CodePudding user response:

You are using single precision floats, which use 32 bits of storage, with 23 bits for the non-sign/exponent bit. That means that two computations will be represented identically** if they differ by about 1 part in 10^6 or 10^7. Your numbers are all just on the edge of that, so you probably lose precision in your last digit or two. If this loss of accuracy is important in your application, use doubles.

**rare cases of one rounding up and the other down aside.

  •  Tags:  
  • Related