我正在尝试编写一个(大部分)* C 程序来对数值结果进行排序并消除重复项。结果存储为 STRUCTS,其中包含一个字符串、一个整数和 4 个双精度数。双打与确定两个结果是否重复有关。
为此,我使用 4 个双精度来 sprintf 一个字符串,以达到一定的精度,即
#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>
. 然后程序检查哈希表是否已经包含该键的条目,如果是,则结果是重复的并且可以丢弃。否则,它会被添加到哈希表中。
问题是有时我的一个值会被 sprintf 从例如 -10E-9 舍入为零;结果,字符串将包含“-0.00000”而不是“0.00000”。尽管代表相同的结果,这两个值显然会生成不同的哈希键。
sprintf 甚至 C 语言中是否有内置的东西可以让我处理这个问题?我想出了一些解决方法(见下面的帖子)——但如果有内置的东西,我宁愿使用它。
*该程序是用 C 编写的,因为这是我最熟悉的语言,但我最终会使用 g++ 进行编译以使用 unordered_map。
我想出了以下解决方法。但是 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;
}