浮点上的printf错误

  • 本文关键字:printf 错误 c
  • 更新时间 :
  • 英文 :


我肯定想不通。打印sum时给出错误的值。如果循环printf中的注释被删除,那么一切都会按预期进行。如果在main体内声明了const float values[],则printf再次正常工作。为什么会发生这种情况?

/* 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()%1000;
sum += values[r];
//printf("%f, %f, %dn",sum, values[r], r);
}
printf("bytes: %ldn", sizeof(sum));
printf("Floatmax: %fn", FLT_MAX);
printf("Result: %fn", sum);

return 0;
}

在循环之前添加srand(time(NULL));

然后,每次运行程序sum时都会有所不同。

在每次运行程序的时刻;"随机";数字序列完全相同。

此外,您访问边界之外的数组,这是未定义的行为。

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

您使用的是单精度浮点,它使用32位存储,其中23位用于非符号/指数位。这意味着,如果两个计算相差10^6或10^7中的一部分,那么它们将被表示为相同的**。你的数字都在边缘,所以你可能会失去最后一两位数的精度。如果这种精度损失在您的应用程序中很重要,请使用doubles

**一个向上,另一个向下的罕见情况。

最新更新