为什么用 std::cin 读取一个巨大的双精度值时,值会略有变化?

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

我发现std::cin的一个奇怪的行为(在Win 10下使用VS 17):当输入大量数字时,std::cin正在读取的数字接近但不同。 有没有对大数进行近似的方法? 如何获得与输入的数字完全相同的数字?

double n(0);

cout << "Enter a number > 0 (0 to exit): ";
cin.clear();                                // does not help !
cin >> n;                                   // enter 2361235441021745907775
printf("Selected number %.0f \n", n);       // 2361235441021746151424 is processed ?.

输出

Enter a number > 0 (0 to exit):
2361235441021745907775
Selected number 2361235441021746151424
c++ floating-point double user-input cin
1个回答
3
投票

您需要了解有效位数。双精度型可以容纳非常大的值,但它只能处理这么多的数字。搜索

C++ doubles significant digits
并阅读 400 个相关网页中的任意一个。

如果您需要更多的数字,则需要使用 double 以外的数字。如果您知道它是整数而不是浮点数,则可以使用

long long int
,它至少有 8 个字节并且可以容纳
2^63-1
。如果您知道它是正数,则可以将其设为
unsigned long long int
,并且您将获得 0 到至少 18,446,744,073,709,551,615 (
2^64-1
) 的范围。

如果你需要更多的数字,你需要找到一个支持任意长整数的库。谷歌搜索

c++ arbitrary precision integer
会给你一些指导。

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