1

使用long doubleI get 18/19 = 0.947368421052631578..., and947368421052631578是重复的小数。使用doubleI get0.947368421052631526...但是,前者是正确的。为什么会有这样不正确的结果?

感谢帮助。

4

3 回答 3

10

Adouble通常提供 16(±1) 个十进制数字。您的示例显示了这一点:

     4   8  12  16
     v   v   v   v
0.947368421052631578 long double
0.947368421052631526 double

答案同意 16 位数字。这是应该预料到的。另请注意,C 标准中不能保证 along double比 a 具有更高的精度double

于 2012-06-19T22:08:32.843 回答
9

您试图用有限的位数来表示每个十进制数。有些东西不能准确地用浮点数表达。期待浮点数的准确答案是您的第一个问题。看看每个计算机科学家应该知道的关于浮点运算的知识

以下是一些讲义的摘要:

如前所述,计算机不能精确地表示实数,因为存储实数的位数是有限的。因此,任何具有无限位数的数字,例如 1/3、2 的平方根和 PI,都不能完全表示。此外,由于实数的编码方式,即使是有限位数也不能精确表示。

于 2012-06-19T22:06:22.433 回答
6

double通常使用IEEE 754实现的A将精确到 15 到 17 位十进制数字。任何过去都不能被信任的东西,即使你可以让编译器显示它。

于 2012-06-19T22:07:58.897 回答