2016-10-11 176 views
1

假设有两个数字22和7我想打印到第100位小数的答案,应该像3.1428571428571428571428571的....而试图用如何精确打印浮点数或双精度型变量的小数位数至100位?

cout << setprecision(100) << fixed << (22.0/7.0); 

我得到这样的事情3.142857142857142793701541449991054832935333251953125。 ......

+4

既不'float'也不'double'有许多显著的数字时,当转换成十进制格式。 [具体来说,'float'具有大约7位精度的小数位数,'double'具有16位数](https:// en。wikipedia.org/wiki/Floating_point#Internal_representation) – jaggedSpire

+1

你可能想尝试像gmp这样的库。 –

+0

不要混淆精度(你可以显示多少个小数位)和准确性(有多少个小数位是正确的)。一旦你超过了第十五个重要数字,你可能会随机附加数字。 –

回答

0

当我尝试

int main() 
{ 
    const long double pi = 22.0/7.0; 
    std::cout << std::setprecision(std::numeric_limits<long double>::max()) << pi << '\n'; 
} 

我越来越细分泄漏。

你得到的max是:

int main() 
{ 
    const long double pi = 22.0/7.0; 
    std::cout << std::setprecision(std::numeric_limits<long double>::digits) << pi << '\n'; 
} 

输出是: 3.142857142857142793701541449991054832935333251953125

+1

你对第一个例子有什么期待? 'std :: numeric_limits :: max()'是可用'long double'表示的最大数字(不是有效数字的数目),并且你隐式地将它转换为'int',这是未定义的行为,因为该值无法表示作为'int'。 'std :: numeric_limits :: digits'是可表示基数2位数的数字,不是十进制数字。您将输出比显着更多的数字。 – user4407569

+0

但我基本上有另一个问题。我提出质疑意见。我也会把它放在这里。 \t 我得到SEG违规。我的问题是我们可以怎样把整个内容放在一个流中? - – Naidu

+0

'digits10'也是错误的,它是可以不加改变地表示的基数为10的数字。它低于存储值的准确度。由于C++ 11有'max_digits10',它会给你唯一存储任何类型值所需的有效位数。当然,指数需要另外保存,即通过科学记数法。 – user4407569

1

通常在C++中,双(两者的更大的)存储在8个字节。 这意味着该数字可以包含2^8 * 8 = 2^64 byes(^ = power)。 这意味着在保持符号和浮点位置之后,该点之后的最大数字位数将最多为〜15位数。因此您将不得不创建其他方法,然后再为此计算加倍。 这里是我的参考: https://www.tutorialspoint.com/cplusplus/cpp_data_types.htm

0

打印不是问题。代码很好地打印作为双重

cout << setprecision(100) << fixed << (22.0/7.0); 

OP's reported result 
3.142857142857142793701541449991054832935333251953125....... 
// My expected result of the double 22.0/7.0 
3.1428571428571427937015414499910548329353332519531250000000.... 

使用double数学,一般情况下不会提供100位精度OP。这是为什么。

不同的解释方法

double一个通常是64位。那最多可以给出2 的组合,完全可以代表的数字。考虑double n,d,q;并划分n/d。即2 n,d的不同组合我们正试图将所有这些结果放入q。很多人会得出相同的答案(22.0/11.0和14.0/7.0都是2.0)。然而,肯定会有超过2个不同的数学答案。

所以C 的答案,最好的 - 通常是最接近 - 表示的double

在这种情况下:22.0/7.0,确切地说,在这两个组合中没有一个是。
“最佳”是“像3.142857 142857 142793 7015414 ......”

double x = 22.0/7.0; 
// x 3.142857 142857 142793 701... 

// 22.0/7.0 
// math 3.142857 142857 142857 142857 

double next_x = nextafter(22.0/7.0, 4.0); 
//  3.142857 142857 143237 790... 
相关问题