数値結果を並べ替えて重複を排除する (ほとんど)* C プログラムを作成しようとしています。結果は、文字列、整数、および 4 つの double を含む STRUCTS として格納されます。double は、2 つの結果が重複しているかどうかを判断するために関連するものです。
これを行うには、4 つの double を使用して文字列をある程度の精度でスプリントします。
#define PRECISION 5
sprintf(hashString, "%.*lf %.*lf %.*lf %.*lf", PRECISION, result.v1, PRECISION, result.v2, PRECISION, result.v3, PRECISION, result.v4);
次に、これを のハッシュキーとして使用し tr1::unordered_map<string, ResultType>
ます。次に、プログラムは、ハッシュテーブルにそのキーのエントリが既に含まれているかどうかを確認します。含まれている場合、結果は重複しており、破棄できます。それ以外の場合は、ハッシュ テーブルに追加されます。
問題は、値の 1 つが sprintf によって、たとえば -10E-9 からゼロに丸められることがあることです。その結果、文字列には「0.00000」ではなく「-0.00000」が含まれます。これら 2 つの値は、同じ結果を表しているにもかかわらず、明らかに異なるハッシュキーを生成します。
これに対処できるようにするために、sprintf または C 言語に組み込まれているものはありますか? 私はちょっとした回避策を考え出しました (以下の投稿を参照)。ただし、何かが組み込まれている場合は、むしろそれを使用したいと思います。
* プログラムは C で書かれていますが、これは私が最も慣れている言語ですが、unordered_map を使用するために g++ でコンパイルすることになります。
次の回避策を考え出しました。しかし、A) 組み込みの解決策があることを願っています.B) atof や浮動小数点演算についてあまり深く理解していないため、条件if(doubleRepresentation == 0.0)
がいつでもトリップするかどうかはわかりません.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PRECISION 5
#define ACCURACY 10E-6
double getRidOfNegZeros (double number)
{
char someNumAsStr[PRECISION + 3]; // +3 accounts for a possible minus sign, the leading 0 or 1, and the decimal place.
sprintf(someNumAsStr, "%.*lf", PRECISION, number);
double doubleRepresentation = atof(someNumAsStr);
if((doubleRepresentation < ACCURACY) && (doubleRepresentation > -ACCURACY))
{
doubleRepresentation = 0.0;
}
return doubleRepresentation;
}
int main()
{
printf("Enter a number: \n");
double somenum;
scanf("%lf",&somenum);
printf("The new representation of double \"%.*lf\" is \"%.*lf\"\n", PRECISION, somenum, PRECISION, getRidOfNegZeros(somenum));
return 0;
}