传递给stringstream时截断double

Truncate double when passing to stingstream

本文关键字:double stringstream      更新时间:2023-10-16

我有一个双精度问题。

std::stringstream ss;
ss << std::setprecision(std::numeric_limits<double>::digits10) << std::numeric_limits<double>::max();

1.79769313486232e+308打印到sting上,而实际上double max是1.79769313486231XXXXe+308。所以再次读取这个stringstream的结果是无穷大。

如何截断数字而不是四舍五入?

四舍五入来自于许多系统使用的IEEE-754浮动型标准。原因是您只能以有限的精度表示数字。其中一个浮点表示是由IEEE-754标准化的。

如果你想截断一些特定数字之后的数字,那么你可以使用std::trunc函数,你可以在math中分别找到cmath头文件。

如果你只想在输出流上截断它,那么你可以使用setprecision指令使用#include<iomanip>头文件。

为了调整舍入操作,您可以设置一些编译器标志。gcc的一个例子是快速数学编译器标志。(有关更多信息,请查看GCC浮点编译器标志)

编辑根据我在这里的评论,您将找到将浮动类型转换为非浮动类型,然后转换为2的补码的进一步信息。更多信息请看这里:删除漂浮转换为二的补码和舍入误差计算的进一步信息

你也可以尝试加载你的浮动到SSE,AVX, ... (depends on your system) .