sách gpt4 ai đã đi

C++ istream 提取器精度?

In lại 作者:行者123 更新时间:2023-11-30 04:23:24 25 4
mua khóa gpt4 Nike

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

      deltaT 0.005;

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

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

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

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

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

谢谢,玛德琳。

1 Câu trả lời

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

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

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

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

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

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

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

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

25 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com