我试图通过读取一个大文件并将它们写成小块来进行外部排序。但是当我从文件中获取ifstream的双值,尽管数字是12位数,但它只得到前6位数。
#include<fstream>
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
void createRun(double *arr, int size, int orderoffile){
make_heap(arr, arr+size);
for(int i=0; i<size ;i++){
pop_heap(arr, arr+size-i);
}
string filename = "sortedTemp" ;
filename += to_string(orderoffile) + ".txt";
ofstream ofs(filename.c_str());
for(int i=0;i<size-1;i++){
ofs<<arr[i]<<endl;
}
ofs<<arr[size-1];
}
int main(int argc, char *argv[]){
ifstream ifs(argv[1]);
int num;
ifs>>num;
int files=num/1024;
double arr[1024];
for(int i=0; i<files ; i++ ){
for(int j=0 ; j<1024;j++){
ifs>>arr[j];
}
createRun(arr, 1024 ,i);
}
int remaining;
if(num%1024!=0){
remaining =num%1024;
files++;
for(int i=0 ; i< remaining; i++){
ifs>>arr[i];
}
createRun(arr, remaining ,files-1);
}
ifs.close();
return 0;
}
我试图读取的文件包含2048个双打,我复制了第一个32.第一个整数只给出了文件中双打的数量。
&GT;
2048
185261.886524
237358.956723
139921.832662
128702.977104
93468.067919
415572.438294
394341.383634
317808.343493
63075.462939
907012.789025
393656.286891
418873.927354
892347.117718
764276.357958
300568.750436
717272.259456
354591.446610
431749.187142
63565.857898
288241.215494
526117.693273
680793.623315
68218.415160
391965.952529
66870.811087
3982.888630
469794.327128
492466.036574
865900.028660
717094.169557
32770.089775
它只是写这样的文件。
836.661
3366.63
3982.89
5394.17
6764.96
9018.77
9034.42
9058.47
10259.5
11236.4
12419.8
13368.7
13659.5
13876
15553.6
15657.5
16682.7
17647.7
19490.9
19519
19632.4
19936.8
22118
23157.6
23718.4
23781.5
24640.4
24889.4
25054.2
25151.9
25647.5
26293.4
答案 0 :(得分:1)
二进制浮点不知道可能有多少有效数字(这在一定程度上不同于未规范化的十进制浮点数并指示有效数字的数量)。浮点数的格式基于存储在流的precision()
字段中的标志。如果您想保留更多数字,可以考虑使用std::numeric_limits<double>::digits10
作为潜在设置。请注意,根据值和其他格式标记(特别是是否设置了std::ios_base::fixed
),您可能会失败格式化算法并获取未正确舍入但更接近地表示实际存储的二进制值的值,而不是近似的十进制值。
答案 1 :(得分:0)
要保留数字的格式,您应该将它们读作字符串而不是双打。那么你有3个实际排序选项: