在C ++中,我可以在不丢失精度的情况下以文本格式编写和读回浮点数(或双精度数)吗?
请考虑以下事项:
float f = ...;
{
std::ofstream fout("file.txt");
// Set some flags on fout
fout << f;
}
float f_read;
{
std::ifstream fin("file.txt");
fin >> f;
}
if (f != f_read) {
std::cout << "precision lost" << std::endl;
}
我理解为什么精度有时会丢失。但是,如果我用足够的数字打印该值,我应该能够读回完全相同的值。
是否有一组给定的标志可以保证永不丢失精度? 这种行为是否可以跨平台移植?
答案 0 :(得分:4)
如果我用足够的数字打印该值,我应该能够读回完全相同的值
如果以十进制形式写入,则不是 - 二进制数字与表示数字所需的小数位数之间不存在整数关系。如果以二进制或十六进制格式输出数字,您将能够在不失去任何精度的情况下读取它。
通常,浮点数在平台之间不可移植,因此您的文本表示无法弥补这一差距。在实践中,大多数机器使用IEEE 754浮点数,因此它可能运行得相当好。
答案 1 :(得分:4)
如果您不需要支持缺乏C99支持的平台(MSVC),那么最好的办法是将%a
格式说明符与printf
一起使用,它始终生成精确的(十六进制) )使用有界数字的数字表示数字。如果使用此方法,则在转换为字符串或返回时不会发生舍入,因此舍入模式对结果没有影响。
答案 2 :(得分:3)
请看一下这篇文章:How to Print Floating-Point Numbers Accurately以及那篇:Printing Floating-Point Numbers Quickly and Accurately。
答案 3 :(得分:1)
您不一定要以十进制的形式打印“2的幂”浮点的确切值 考虑使用base 3存储1/3,现在尝试以十进制方式完美打印1/3。
有关解决方案,请参阅:How do you print the EXACT value of a floating point number?