2009-12-06 61 views
2

我真的很努力将一些数值浮点数据从一个文件加载到C程序中......该文件具有浮点数,精度为3个小数点,每个小数点都在一个单独的行...我想加载这些值到一个浮点数组,然后在其中执行一些计算...但是我试图将它加载到一个浮点数组中,但它没有正确存储值...即像123.45被存储为123.44999或其他...但我不想要这个。从文件中加载数据C

我试图将它存储在一个字符串数组中,然后可能会将它们转换为缩放整数。但我不能让它加载到一个字符串数组。谁能告诉我我哪里出错了。我所做的就是这样的。

unsigned char **data 
............ 
data = malloc(sizeof(unsigned char *) * fileSize); 
............ 
while (!feof(fp)) 
{ 
if (fscanf (fp, "%s", &data[j]) == 1) // if converted, increment counter 
++j; 
} 
........... 

我是新手,所以我不太擅长指针。并在我加载到一个字符串数组后,我如何将它转换成缩放整数?

+3

你正在分配文件大小乘以ptr的大小,而不是你想要的。 – 2009-12-06 10:30:18

+0

@Mitch:我认为这是他的意图,因为他希望每个数字都有一个单独的字符串,并且数据保存指向字符串的指针。但是,在代码中还有一些其他问题... – 2009-12-06 11:50:51

回答

1

不使用float,使用double。

也可以使用

double d;

read(d);

(int)(d * 100)得到int。

+0

小心!你不想截断结果乘以100,因为那样你会失去精度。 Try(int)(d * 100 + 0.5) 否则123.45,存储为123.44999将最终为12344 – 2009-12-06 11:56:41

+0

使用double似乎适用于我。 – sfactor 2009-12-06 12:13:25

+0

@Tony感谢您指出:) – 2009-12-06 13:03:59

0

不幸的是,您所碰到的是一些数字无法用浮点数据类型准确表示的事实。如果您手动将124.45分配给C中的浮点数(即float f = 123.45),则会出现完全相同的问题。

真的需要精确度吗?你有什么数据计划?

3

你可能没有太多的选择,当涉及到浮点数喜欢123.45被显示为123.44999

浮点表示的“不准确”的SO,here's one example已经讨论过很多次了。

我建议你回去把输入视为浮点数,但是读到精度问题。

+0

+1用于纠正潜在的有缺陷的浮点假设 – 2009-12-06 10:39:49

+2

123.45如果仅显示为2dp,则不会显示为123.44999。换句话说,123.45 == 123.44999到2dp,只要你不会犯第一位数字打印出来的结果的错误,你应该没问题。 – 2009-12-06 11:53:51

0

我建议你使用ifstream来读入字符串,然后将其转换为double。

string number; 
ifstream yourfile("yourfile", ios::in); 

if(yourfile) 
    while(yourfile >> number){ 
    double yourFloat=strtod(number.c_str()); 
    } 
+0

他没有使用C++ – 2009-12-06 11:04:26

0

这个精度对您的应用程序有多重要?浮点数通常可能会稍微不准确,因为它们将数字存储在基数2(二进制)表示中,该表示无法正确表示一些基数为10的数字。

你有几个选择,取决于这个精度对你的应用程序有多重要。

  1. 住在一起。也许这个错误对您的应用程序来说不是问题
  2. 使用Double。它有两倍的空间 来表示数字,并且将更精确地为 。在某些情况下,它仍然可能不准确 。
  3. 使用定点数学。如果您只需要n位小数,那么可能需要查看这种方法(因为它消除了不准确性的根源)。
  4. 将float保留为字符串或将其存储为二进制编码的Decimal。您需要为您需要的任何数学运算编写函数,并且性能将是这4个选项中最差的。但是,您将能够使用任意精度的十进制数字,而不必担心精度的任何损失。

选项3或4需要使用外部库或滚动自己的实现。如果1或2足够好,那么我不会为这些选项而烦恼。

+0

是的,使用double工作 – sfactor 2009-12-06 12:14:07