如何准确打印浮点数或双精度类型变量的小数点后 100 位?
How to print upto 100th decimal places accurately of a float or double type variable?
假设有两个数字 22 和 7。我想打印答案的小数点后第 100 位,它应该看起来像 3.1428571428571428571428571.... 而尝试使用
cout << setprecision(100) << fixed << (22.0/7.0);
我得到类似 3.142857142857142793701541449991054832935333251953125......
当我尝试时
int main()
{
const long double pi = 22.0/7.0;
std::cout << std::setprecision(std::numeric_limits<long double>::max()) << pi << '\n';
}
我遇到分段泄漏问题。
您获得的最大值是:
int main()
{
const long double pi = 22.0/7.0;
std::cout << std::setprecision(std::numeric_limits<long double>::digits) << pi << '\n';
}
输出为:
3.142857142857142793701541449991054832935333251953125
一般在c++中,double(两者中较大的)存储在8个字节中。
这意味着该数字可以包含 2^8*8 = 2^64 字节(^ = 幂)。
这意味着在保留符号和浮点位置之后,点后的最大位数最多为 ~15 位。因此,您将不得不创建其他方法,然后为该计算加倍。
这是我的参考:
https://www.tutorialspoint.com/cplusplus/cpp_data_types.htm
打印不是问题。代码很好地将商 打印为 double.
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。这就是原因。
解释方式不同
A double
通常是 64 位。这给出了 264 个 可完全表示的 数字的组合。考虑 double n,d,q;
并除以 n/d
。那是 n,d
的 2128 种不同组合,但我们正试图将所有这些结果放在 q
中。许多会得到相同的答案(22.0/11.0 和 14.0/7.0 都为 2.0)。然而,肯定有超过 264 个不同的数学答案。
所以 C rounds 最好的答案 - 通常最接近 - representable double
。
在这种情况下:22.0/7.0,确切地说,不属于那些 264 组合之一。
"best" 是 "something like 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...
试试这个,将答案四舍五入到小数点后 100 位。
double long a,b,n;
cin>>a>>b;
n=a/b;
std::cout << std::fixed;
std::cout << std::setprecision(100);
std::cout << n << '\n';
假设有两个数字 22 和 7。我想打印答案的小数点后第 100 位,它应该看起来像 3.1428571428571428571428571.... 而尝试使用
cout << setprecision(100) << fixed << (22.0/7.0);
我得到类似 3.142857142857142793701541449991054832935333251953125......
当我尝试时
int main()
{
const long double pi = 22.0/7.0;
std::cout << std::setprecision(std::numeric_limits<long double>::max()) << pi << '\n';
}
我遇到分段泄漏问题。
您获得的最大值是:
int main()
{
const long double pi = 22.0/7.0;
std::cout << std::setprecision(std::numeric_limits<long double>::digits) << pi << '\n';
}
输出为: 3.142857142857142793701541449991054832935333251953125
一般在c++中,double(两者中较大的)存储在8个字节中。 这意味着该数字可以包含 2^8*8 = 2^64 字节(^ = 幂)。 这意味着在保留符号和浮点位置之后,点后的最大位数最多为 ~15 位。因此,您将不得不创建其他方法,然后为该计算加倍。 这是我的参考: https://www.tutorialspoint.com/cplusplus/cpp_data_types.htm
打印不是问题。代码很好地将商 打印为 double.
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。这就是原因。
解释方式不同
A double
通常是 64 位。这给出了 264 个 可完全表示的 数字的组合。考虑 double n,d,q;
并除以 n/d
。那是 n,d
的 2128 种不同组合,但我们正试图将所有这些结果放在 q
中。许多会得到相同的答案(22.0/11.0 和 14.0/7.0 都为 2.0)。然而,肯定有超过 264 个不同的数学答案。
所以 C rounds 最好的答案 - 通常最接近 - representable double
。
在这种情况下:22.0/7.0,确切地说,不属于那些 264 组合之一。
"best" 是 "something like 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...
试试这个,将答案四舍五入到小数点后 100 位。
double long a,b,n;
cin>>a>>b;
n=a/b;
std::cout << std::fixed;
std::cout << std::setprecision(100);
std::cout << n << '\n';