gpt4 book ai didi

C++ istream 提取器精度?

转载 作者:行者123 更新时间:2023-11-30 04:23:24 25 4
gpt4 key购买 nike

我正在读取包含以下行的文本文件:

      deltaT          0.005;

在字符串中找到正确的行后,我想使用如下代码读出该值:

      double deltaT;
stringstream ss(line);
ss >> tag; //Contains: deltaT
ss >> deltaT; //Should contain: 0.005

在调试过程中,我看到 deltaT 包含:0.0050000000000000001

那么有没有办法像流插入器一样设置提取器的“精度”?

或者保证文本文件中的值是我程序中的 double 值的最佳方法是什么。

谢谢,玛德琳。

最佳答案

这是二进制浮点类型的常见问题:0.005 不能完全用 double 表示,因此从“十进制字面值”进行的转换会产生最相似的结果由 double 表示的数字。

如果您想使用double 或其他有限的二进制浮点类型,则没有解决方案,因为0.005 具有十进制的有限形式,但是is periodic in binary (并且任何 FP 类型的尾数都是有限的)。

要了解这怎么可能,请考虑分数 1/3:在基数 3 中它具有有限表示,而在基数 10 中它是周期性的:

(1/3)10 = 0.33333...10 = 0.13

现在,任何“常规”浮点类型都只有一些有限的尾数空间(即要存储的有效数字),因此每个周期数都必须在某个点被截断(实际上是四舍五入);这会导致您看到的精度下降。

请注意,有几个“任意精度库”可用于处理此类问题并以仅受可用内存限制的精度进行数学计算(例如 GMP ),但您应该考虑额外的复杂性/性能损失精度的提高实际上是合理的。

另一种解决方案(通常在进行涉及金钱的计算时使用)是使用固定精度类型,它将金额存储为整数,并按某个小数因子“隐式缩放”(概念是将美分存储为整数而不是美元作为 float 或其他);这避免了从十进制到二进制转换的任何意外,因为所有整数都可以用任何基数中有限的数字精确表示。

关于C++ istream 提取器精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13388425/

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