对某些标准流类插入和提取浮点数是否保留其值
Does insertion and extraction of a floating point number to some of the standard stream classes preserves its value?
在调试时,我有时想打印一个函数返回的浮点数,并将其用作另一个函数的输入值。我想知道指导浮点数格式的默认参数是什么。
f1和f2在下面的代码中总是相同的吗?
#include <sstream>
#include <cassert>
int main(int argc, const char *argv[])
{
std::stringstream ss;
float f1 = .1f;
ss << f1;
float f2;
ss >> f2;
assert(f1 == f2);
return 0;
}
我是否可以将一堆浮点数写入std::cout或std::ofsteam并读取它们以获得完全相同的数字,或者我是否应该显式设置小数点后的数字数量(就像这里建议的那样)?
令我困扰的是,尽管.1不能表示为二进制分数,但它仍然可以被标准流正确格式化。
不一定。缺省情况下,ostream
输出6位精度。为了能够"往返"浮动,您需要std::numeric_limits<float>::max_digits10
(其中最常见的表示是9)。如果流是被用于持久化,而你只持久化浮点数,只需在写入任何内容之前设置精度,例如:
ss.precision( std::numeric_limits<float>::max_digits10 );
(如果您需要同时处理float
和double
,并且不希望对于float
上的额外数字,您需要设置精度每次输出一个浮点值)
不,它们不能保证相同。
实际情况是float本身的精度比默认情况下输出的精度高,所以只要你读取的有效数字少于默认输出精度,你输出的结果将(至少通常)四舍五入到你读取的值。
但是,如果您有使用float
的全精度的数据,并且您将其读入,然后以全精度将其写出来,您将开始看到差异。
#include <sstream>
#include <iomanip>
#include <iostream>
int main() {
std::istringstream buffer("0.1");
float value;
buffer >> value;
std::cout << value << "n";
std::cout << std::setprecision(10) << value;
}
结果:0.1
0.1000000015
在这种情况下,末尾的15
(大约)是0.1与我的编译器的float所能表示的最接近的近似值之间的差。
更重要的是,assert(f1 == f2);当f1和f2都是浮点数时,很少正确。你想要assert(abs(f1 - f2) <公差);有几种通常用于选择公差的技术。您应该使用哪一个取决于您的程序要解决的问题。>
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 返回浮点数的小数位数
- 找到一种使用 C++ 中的条件提取浮点数的方法
- 如何使用 sscanf 提取浮点数?
- 如何在 c++ 中使用 FFT 从 32 位浮点数组中提取频率
- Z3 SMT求解器 - 如何在FPA中提取浮点数的值
- 从C 中的字符串中提取浮点数的最简单方法
- 如何从字符串中提取浮点数
- 从 CString 中提取浮点数
- 如何从C++文件中的特定行中提取数字(浮点数)
- std::istream 提取运算符(双精度或浮点数)在 VS 2012 中非常慢
- 从浮点数中提取数字
- 精确地提取浮点数的小数部分
- 对某些标准流类插入和提取浮点数是否保留其值