Я пытаюсь написать (в основном) * C программу, которая сортирует числовые результаты и удаляет дубликаты.Результаты сохраняются как STRUCTS, которые содержат строку, целое число и 4 двойных числа.Двойные значения - это то, что важно для определения того, являются ли два результата дубликатами.
Для этого я бегу строку с четырьмя двойными точками с некоторой точностью, т.е.
#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>
.Затем программа проверяет, содержит ли хеш-таблица запись для этого ключа, если это так, результат является дубликатом и может быть отброшен.В противном случае он добавляется в хеш-таблицу.
Проблема в том, что иногда одно из моих значений будет округлено до нуля, например, от -10E-9, до sprintf;В результате строка будет содержать «-0,00000», а не «0,00000».Эти два значения, очевидно, будут генерировать разные хеш-ключи, несмотря на то, что они представляют один и тот же результат.
Есть ли что-то встроенное в sprintf или даже язык C, который позволит мне разобраться с этим?Я немного поработал (см. Пост ниже) - но если что-то встроено, я бы скорее использовал это.
* программа написана на C, потому что это языкМне удобнее всего, но в итоге я скомпилирую с g ++, чтобы использовать unordered_map.
Я нашел следующий обходной путь.Но А) Я надеюсь, что есть встроенное решение, и Б) У меня нет глубокого понимания математики 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;
}