我正在嘗試編寫一個(主要)* C程序,用於對數值結果進行排序並消除重複項。結果存儲爲包含字符串,整數和4個雙打的STRUCTS。雙打是確定兩個結果是否重複的相關信息。獲取printf以忽略零值的負號
要做到這一點,我使用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>
一個hashkey sprintf的一個字符串。然後程序檢查哈希表是否已經包含該鍵的條目,如果是,結果是重複的並且可以被丟棄。否則,它會被添加到散列表。
問題是有時候我的一個值會被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;
}
也許應該用C++標記 - 畢竟,解決方案可能涉及tr1庫中的散列計算。一個可能的答案 - 寫一個自定義哈希函數,調用標準函數,但在轉發之前調整參數。但是,您可能還需要一個自定義運算符==來爲散列表檢查密鑰。 – Steve314
添加了C++標記。儘管如果可能的話,我真的很想避免寫一個散列函數。 – BenB
這可能會有點不利於開發大部分C語言,我只是想利用偶爾的C++庫。 – Steve314