C++中long double的精度是多少?

30

有没有人知道如何在特定平台上查找 long double 的精度?我似乎在17个小数位后失去了精度,这与我只使用 double 时相同。我原本期望能获得更多精度,因为在我的平台上,double 用8字节表示,而 long double 则用12字节。

在你问之前,这是为了欧拉计划,所以是的,我需要超过17位数字。 :)

编辑:感谢快速回复。我刚刚确认,在我的系统上只能通过使用 long double 来获得18位小数位。


它是否可能在某个时候将事物转换为常规的双精度? - Paul Tomblin
是的,这绝对是可能的。昨晚我一直检查代码到凌晨2点,我相当确定它完全使用了长双精度。 - Bill the Lizard
2个回答

39

你可以使用 std::numeric_limits 来查找:

#include <iostream>     // std::cout
#include <limits>       // std::numeric_limits
int main(){
    std::cout << std::numeric_limits<long double>::digits10 << std::endl;
}

这会告诉你精度还是只有限制? - Paul Tomblin
2
它告诉你精度,即双精度浮点数可以有多少位数字。min()和max()告诉你极限。 - Johannes Schaub - litb
更具体地说,它会告诉您可以将多少个数字舍入为长双精度浮点数而不会丢失数字。 - user7116
是的,虽然min()和max()函数可以告诉你即使在失去精度的情况下你可以拥有的限制。在这里,max的值为1.18973e+4932,而digits10的值为18。 - Johannes Schaub - litb
7
在x86平台上,浮点数通常采用80位扩展格式:64位尾数,15位指数,可能会有大约18个有效数字。Double类型是53位尾数或16个有效数字。 - user7116
显示剩余2条评论

6
您可以使用<cfloat>。具体来说:
LDBL_DIG

谢谢提供链接。LDBL_DIG提供十进制数字。LDBL_MANT_DIG给了我二进制数字。 - Bill the Lizard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接