3

重複の可能性:
浮動小数点の不正確な例
JavaScriptの数学は壊れていますか?

txtファイルのデータをdouble値に変換する必要があり、この関数を使用しています:atof。問題は、変換する必要のある値が5.550000であり、atof関数が5.5499999999999998を返すことです。これは、この数値を使用してGPAを計算する必要があり、結果が正確ではないため、問題です。これは、txtファイルからデータを読み取る関数です。

void readNext(FILE* file,Lab* lab)
{
    char line[100];
getline(file,line,100);
if (strcmp(line,"") == 0)
{
    lab->is_null = 1;
    return;
}
strcpy(lab->date,line);
getline(file,line,100);
lab->presence = atoi(line);
getline(file,line,100);
strcpy(lab->num_work,line);
getline(file,line,100);
lab->mark_work = atof(line);
getline(file,line,100);
lab->test_work = atof(line);
getline(file,line,100);
lab->current = atof(line);
getline(file,line,100);
lab->status_work = atoi(line);
getline(file,line,100);
}
4

3 に答える 3

3

このStackOverflowの記事を参照してください。

フロートには、追加の作業なしで、必要に応じて正確な値を表す問題が発生します。2つの問題(リンクされた投稿で説明されています)に直面します-実際の丸めとフォーマット。

于 2011-05-31T21:00:22.880 に答える
2

簡単な答え:atof("5.55")この小数の正確な(正確な意味の)表現は返されません。この数値の正確な2進浮動小数点表現は存在しないため、無限の2進小数です。

長い答えについては、http://www.math.umd.edu/~jkolesar/mait613/floating_point_math.pdfを参照してください。

于 2011-05-31T21:34:11.083 に答える
2

drhirschは正しいです-5.55は2進浮動小数点で正確に表すことはできません(1÷7を10進数で正確に表すことができないのと同じように)。

ただし、フロートは間違いなく5.55を3箇所に正確に格納できるため、これは問題にはなりません。これは、現在の数値です。これは、印刷時に正しい形式を使用する必要があることを意味します。この場合は、です。GPAを計算する場合、平均の計算は壊滅的なキャンセルを引き起こさないため、計算は3か所まで正確になります。%.3g

于 2011-06-01T04:35:06.787 に答える