fscanf和fprintf为C程序中的文本文件更改的值

时间:2016-08-19 11:17:54

标签: c

我想通过下面的C程序从“输入数据”输出“正确的输出数据”。但结果显示值的变化类似于“实际输出数据”。让我知道如何解决它。

输入数据
-5190.978 -90026.901 158.677 15 90 81 58
-5165.821 -90011.875 152.742 15 90 89 54
-5158.762 -90010.093 148.083 31 80 82 42

正确的输出数据
-5190.978 -90026.901 158.677 90 81 58
-5165.821 -90011.875 152.742 90 89 54
-5158.762 -90010.093 148.083 80 82 42

实际输出数据
-5190.978 -90026.898 158.677 90 81 58
-5165.821 -90011.875 152.742 90 89 54
-5158.762 -90010.094 148.083 80 82 42

/***************************************************************************:::
 xyz(ref)rgb2xyzrgb
    19/08/2016
 ver1.1 2009/3/7
 *******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main(int argc,char *argv[])
{

    FILE *fpr,*fpw;
    int ref,r,g,b;
    float x,y,z;
    float n_x,n_y,n_z;

    /*****************************************************
         2.command line arguments processing
    *******************************************************/
    if(argc!=3)
    {
            fprintf(stderr,"Usage: %s (1)input_org.txt\n(2)write_xyz FILENAME\n",argv[0]);
            exit(1);
    }
    printf("OPEN FILE NAME:%s\n",argv[1]);

        /**********************************************************************************
         **********************************************************************************
         4.  FILE OPEN + Binary File Input
         **********************************************************************************
         *************************************************************************************/

    // open input file
    if((fpr=fopen(argv[1],"rt"))==NULL)
    {
        printf("file cannot be opened。\n");
        exit(1);
    }

    //write file
    if((fpw=fopen(argv[2],"wt"))==NULL)
    {
        fprintf(stderr,"DSM by GSI data.raw\n");
        exit(1);
    }

    while (fscanf(fpr,"%f %f %f %d %d %d %d", &x,&y,&z,&ref,&r,&g,&b) != EOF)
    {
        //printf("%.3f %.3f %.3f %d %d %d\n",x,y,z,r,g,b);
        n_x = roundf(x * 1000) / 1000;
        n_y = roundf(y * 1000) / 1000;
        n_z = roundf(z * 1000) / 1000;
        //printf("%.3f %.3f %.3f %d %d %d\n",n_x,n_y,n_z,r,g,b);        
        fprintf(fpw,"%.3f %.3f %.3f %d %d %d\n",n_x,n_y,n_z,r,g,b);
            //printf("x:%f y:%f z:%f\n", x,y,z);
    }

    fclose(fpr);
    fclose(fpw);

}

1 个答案:

答案 0 :(得分:2)

而不是-90026.901计算机存储最接近精度的数字。它是90026.898。请记住,数字存储在binary计算机上,901/1000没有有限的二进制形式。出于这个原因,一些精度将被削减。

如果您尝试打印1/3,情况就会一样。它不会打印所有数字,但实际上你可以期待它,因为你已经习惯了十进制系统。在二元系统中,一些具有有限小数形式的分数不会有一个。

解决方案?总是尝试放大macheps这是算术精度。最简单的方法是使用double代替float。它仍然没有给出100%,但它更有可能发挥作用。

这个主题被称为scientific calculation,对程序员来说很痛苦。