双重和准确性

问题描述 投票:0回答:3

使用

long double
我得到
18/19 = 0.947368421052631578...
947368421052631578
是循环小数。使用
double
我得到
0.947368421052631526...
但是,前者是正确的。为什么结果这么不正确?

感谢您的帮助。

c++ math double
3个回答
11
投票

A

double
通常提供 16(±1) 位十进制数字。你的例子表明了这一点:

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

答案同意 16 位数字。这是应该预料到的。另请注意,C 标准中不保证

long double
double
具有更高的精度。

注意,数学运算后最后一位十进制数字(16 或 17)不会保持准确(至少在所有实现和/或平台中),因此将代码限制为 15 位。

此外,

double
可以存储小数点之前之后的15位数字,而不是同时存储在两侧(否则进动会丢失)。


9
投票

您试图用有限数量的位来表示每个十进制数。有些东西无法用浮点精确表达。期待浮点数的确切答案是您的第一个问题。看看每个计算机科学家应该了解的浮点运算知识

以下是一些讲义的摘要

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


6
投票
通常使用 IEEE 754

实现的

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

© www.soinside.com 2019 - 2024. All rights reserved.