用C从文件中读取数据(精确到15位小数)

用C从文件中读取数据(精确到15位小数),c,c++11,cygwin,C,C++11,Cygwin,我需要读取的文本文件的格式如下(data.dat)- 0.001505882352941 34.90000000000018 121.8000000000010 我想将以下值分配给给定的float类型的缓冲区,约束条件是我不能更改缓冲区的数据类型 fprintf(file_ptr, "%f", &buffer); 我也尝试了其他方法 double val; fprintf(file_ptr,"%lf", &val); buffer = (float *) val; 但

我需要读取的文本文件的格式如下(data.dat)-

0.001505882352941
34.90000000000018
121.8000000000010

我想将以下值分配给给定的float类型的缓冲区,约束条件是我不能更改缓冲区的数据类型

 fprintf(file_ptr, "%f", &buffer); 
我也尝试了其他方法

double val;  
fprintf(file_ptr,"%lf", &val);
buffer = (float *) val;
但是我没有得到正确的值
我正在cygwin窗口上运行这个程序

小数点后的值在数字上始终保持不变,直到15位

它的类型是float,约束是我不能更改缓冲区的数据类型

 fprintf(file_ptr, "%f", &buffer); 
那你就有问题了

小数点后的值在数字上始终保持不变,直到15位

这是一个双精度浮点可以容纳的有效位数。IEEE 754双精度浮点值的尾数有53位可用。这就得到了log10(2^53)=精度的15.95位小数(四舍五入到15位)。这就是它所能容纳的

如果需要更高的精度,则必须使用不同的数据类型,可能还需要使用多精度数学库

它的类型是float,约束是我不能更改缓冲区的数据类型

 fprintf(file_ptr, "%f", &buffer); 
那你就有问题了

小数点后的值在数字上始终保持不变,直到15位

这是一个双精度浮点可以容纳的有效位数。IEEE 754双精度浮点值的尾数有53位可用。这就得到了log10(2^53)=精度的15.95位小数(四舍五入到15位)。这就是它所能容纳的


如果您需要更高的精度,则必须使用不同的数据类型,可能还需要使用多精度数学库。

要有点挑剔。这些值真的是20+位精度吗?它们看起来像34.9和121.8,加上以前浮点计算中的一些微小人工制品。不到15个位置,你真的有/需要这么高的精度吗?请记住,15位有效数字几乎足以代表太阳系的周长(~1.43e13m),精确到厘米。这有点吹毛求疵。这些值真的是20+位精度吗?它们看起来像34.9和121.8,加上以前浮点计算中的一些微小人工制品。不到15个位置,你真的有/需要这么高的精度吗?请记住,15位有效数字几乎足以表示太阳系的周长(~1.43e13m)到最近的厘米。在15个位置可以读取,但我没有得到文件中提到的值。@RohanG:Something,Something roundoff error…浮点只能表示(小的)具有绝对精度的有理数的子集。对于该集合之外的所有内容,您只能得到一个近似值。这是使用浮点时你必须同意的交易。可以读取15个位置,但我没有得到文件中提到的值。@RohanG:Something,Something roundoff error…浮点只能表示具有绝对精度的有理数的(小)子集。对于该集合之外的所有内容,您只能得到一个近似值。这是使用浮点时必须同意的交易。