c++:在文件中写入双精度值,精度高于默认值
C++ : Writing doubles in a file with more precision than default
我想写双精度到一个文件,但字符串强制转换降低了精度。编辑:我不真正强制转换,但把双精度在ostringstream。
是否有另一种方法比解析每个数字使用模和除法写精度更高的双精度?
编辑:我的应用程序需要是便携式的
下面是我当前的代码:
std::string arraytocsv(double v[], int size) {
std::ostringstream oss;
for (int i = 0; i < size; i++) {
oss << v[i] << ";";
}
oss << std::endl;
return oss.str();
}
我已经有了precision()函数,它工作了。由于
可以使用精度函数
在声明字符串流之后改变它的行为:
std::ostringstream oss;
oss.flags (std::ios::scientific);
oss.precision (std::numeric_limits<double>::digits10 + 1);
第一个调用oss.flags()
,强制c++ I/O在这个字符串流上使用科学记数法,即使是像pi这样的数字。
第二个调用,oss.precision()
告诉c++ I/O在小数点后打印多少位数字。使用digits10+1告诉它打印一个多余的数字;digits10
表示系统能够在不损失精度的情况下表示多少位数字。
您将需要#include,因为std::numeric_limits<double>::digits10
。
用二进制写。默认情况下,这是不可移植的(因为序列化格式依赖于体系结构)
不是double myvalue = 123.4;
file << myvalue;
double myvalue = 123.4;
file.write((const char*) &myvalue, sizeof(myvalue));
当然,这假设您不需要人类阅读这篇文章(尽管,使用UNIX工具,如od
,他们可能需要)
如果您只在一个系统上工作,您可以将实际的二进制数据写入文件,这将为您提供一个精确的副本。如果要写入文本文件,请将二进制文件转换为Base64或类似的格式。
std::ofstream myfile("file.bin");
double x;
myfile.write(reinterpret_cast<char*>(&x), sizeof(x));
// later
std::ifstream yourfile("file.bin");
double x;
myfile.read(reinterpret_cast<char*>(&x), sizeof(x));
可选,将字节流编码为base64。如果您希望存储长双精度类型,并且您打算使用base64编码,请注意长双精度类型通常只有10个字节,因此您可以忽略在序列化时通常会得到的填充。
如果您计划在不同的平台之间交换数据,但所有平台都使用IEEE浮点数,那么您可能应该更加小心并记录文件格式的端序。在这种情况下,使用base64编码编写ASCII字符串将更具可移植性。要在而不是都使用相同二进制浮点数表示的平台之间交换数据,您必须更加努力…
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 具有默认值的引用获取函数
- 当给定默认值时,为什么此模板参数推导失败
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 格式化浮点值:返回默认值
- 如何将数组部分初始化为某个默认值?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 创建一个包含 c++ 默认值的环境文件
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- Switch 语句(字符串)一直选择默认值,除非其为零
- 如何使用默认值将枚举声明为 extern
- 如何在提升程序选项中设置矢量<矢量>的默认值<string>
- 如何使用默认值为构造函数中的枚举赋值?
- 变量始终在函数中重置为默认值
- 如何在C++中提供模板化函数作为另一个函数的参数,默认值?
- 错误C++在Visual Studio 2019中使用numeric_limits的长双精度最小值/最大值
- 函数不返回默认值
- 具有公共范围与专用范围的默认值的C++的不同行为
- c++:在文件中写入双精度值,精度高于默认值