gpt4 book ai didi

c++ - stringstream setprecision 和浮点格式

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:30:21 25 4
gpt4 key购买 nike

double value = 02369.000133699;//acutally stored as 2369.000133698999900
const std::uint32_t left = std::uint32_t(std::abs(value) < 1 ? 1: (1 + std::log10(std::abs(value))));

std::ostringstream out;
out << std::setprecision(std::numeric_limits<T>::digits10 - left ) << std::fixed << value;
std::string str = out.str(); //str = "2369.00013369900"

std::ostringstream out2;
out2 << std::setprecision(std::numeric_limits<T>::digits10 ) << std::fixed << value;
std::string str2 = out2.str(); // str2 = "2369.000133698999900"

我想知道 std::stringstream/precision 如何用于格式化 float 。似乎如果精度参数优于 16 减去非小数位数,这会导致格式为 "2369.000133698999900" 而不是“nice” “2369.00013369900”

std::stringstream 如何知道 8999900 必须恢复为一个 9 即使我没有告诉它进行舍入在 8 上(比如将 12 作为参数传递给 setprecision 函数)?但不要对大于 12 的参数执行此操作

最佳答案

将二进制 float 格式化为十进制值是相当棘手的。潜在的问题是二进制 float 不能准确地表示十进制值。即使是像 0.1 这样的简单数字也不能用二进制 float 来精确表示。也就是说,所表示的实际值略有不同。当使用聪明的算法来读取(“Bellerophon”)和格式化(“Dragon4”;这些是原始论文中的名称并且在实践中使用的两种算法都有改进) float 用于传输十进制值。然而,当要求算法格式化比它实际可以容纳的更多的小数位时,即超过 std::numeric_limits<T>::digits10。 ,它会很乐意这样做,[部分] 揭示它实际存储的值(value)。

格式化算法(“Dragon4”)假定给定的值是最接近浮点类型的原始可表示值。它使用此信息以及当前位置的误差估计来确定正确的数字。该算法本身很重要,我还没有完全理解它是如何工作的。它在 Guy L. Steele Jr. 和 Jon L. White 的论文“How to Print Floating-Point Numbers Accurately”中有所描述。

关于c++ - stringstream setprecision 和浮点格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13104167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com