犰狳保存双精度ascii

时间:2017-03-15 12:19:35

标签: c++ armadillo

我想用犰狳库保存一些ascii格式的复杂双精度矩阵,但不知何故只保存了6位有效数字......我知道这个截断(或舍入,避免检查)可以通过使用二进制格式来克服,但我想使用ascii,以便我可以手动验证和修改某些值。 在下面提供的mwe中,我预计矩阵A和C对于大约16位有效数字是相同的。是否有秘密转换告诉犰狳以更高的精度保存ascii格式的复杂矩阵?感谢

#include <iostream>
#include <armadillo>

using namespace std;
using namespace arma;

int main()
{
cout.precision(20);
cx_mat A = randu<cx_mat>(2,2);
A(0,0) = 1.2345678901234567890;
A.raw_print(cout);
A.save("A.arma_ascii", arma_ascii);
cout << endl;
cx_mat C;
C.load("A.arma_ascii", arma_ascii);
C.raw_print(cout);
return 0;
}

编辑此问题仅发生在复杂矩阵中。对于真实的,armadillo在diskio_meat.hpp中设置精度。似乎解决这个限制的唯一方法是修补犰狳或单独保存复杂和想象的部分。

编辑2 问题在犰狳图书馆(git commit)中解决,仅在此处发布问题后2小时。干得好!

1 个答案:

答案 0 :(得分:1)

我认为问题是cx_mat的基础数据类型是complex<double>,因此您不能指望超过15-17个有效小数位数精度,请参阅https://en.wikipedia.org/wiki/Double-precision_floating-point_format。 在Armadillo代码中,他们使用std::ofstream作为输出,默认显示6位数,就像你在A.arma_ascii文件中一样。