保存和读取加倍而不会丢失精度

时间:2018-06-25 12:36:52

标签: python c floating-point

我想将一个double序列保存到一个.txt文件中,并稍后在C中阅读它们。如何在不损失精度的情况下实现这一点?我不知道要保存多少位数?我怀疑如果没有保存足够的数字,我可能无法获得我保存的确切倍数。

下面是我尝试过的

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class Solution {
    public static void main(String[] args)  throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        while(true){
            System.out.println("start!!");
            int input = Integer.parseInt(br.readLine());        
            if(input == 0){
                break;
            }
            int ddable = 2*input;
            int answer = 0;
            ArrayList<Integer> base = new ArrayList<>();

            if(input == 1){
                answer = 1;
            }else { 
                System.out.println("It is not 1");
                for(int i = 2 ; i <= ddable ; i++ ){
                    base.add(i);
                }

                for ( int i = 2 ; i <= ddable ; i++ ){
                    for ( int j = 2 ; i*j <=ddable ; j++){
                        if(base.contains(new Integer(i*j))){
                            base.remove(new Integer(i*j));
                            System.out.println(i*j+"removed");
                        }
                    }
                }
                int count = 0;
                for ( int i = input ; i <= ddable ; i++){
                    if(base.contains(new Integer(i))){
                        count++;
                    }
                }
                answer = count;
            }
            System.out.println("syso: "+answer);
            bw.write("bw: "+answer);
        }
        bw.flush();
        br.close();
        bw.close();
    }
}

我(我想)对数据的两个不精确表示doubles=[3.14159, 3.14159265358] filename="tmp.txt" with open(filename,'w') as f: for x in doubles: f.write("%.16f\n" %x) 。     3.1415899999999999     3.1415926535800001

这是不可取的。我希望数据按原样存储,以便另一个程序可以准确地检索它们。有想法吗?

1 个答案:

答案 0 :(得分:2)

在C11中,将DBL_DECIMAL_DIG定义为精确地用于此用途:请参见https://en.cppreference.com/w/c/types/limits。它告诉您所需精度的小数位数,以便先加载已保存的double,然后先进行保存然后重新加载,这意味着两个加载步骤将始终返回相同的 double

DBL_DECIMAL_DIG通常为17。