输出大数

Output of large numbers

本文关键字:输出      更新时间:2023-10-16

我需要在我的程序中使用一个高数字。这里有一个最小的例子来说明这个问题。它只是读入一个数字,然后再给出这个数字。

using namespace std;
#include <iostream>
#include <stdlib.h>
int main(int argc, char* argv[])
{
    double 
    N = atoi(argv[1]);
    cout << N << endl;
    return 0;
}

一切都很好,直到10^9如果我把10^10作为输入,结果是1.41007e+09。我只是不知道为什么会这样。我已经尝试了以下操作:

  • 将N的数据类型更改为double, long int, unsigned int
  • 直接在程序中定义N = pow(10,10)。当我直接输出N pow(10,10)时,N给出了错误的值,而pow(10,10)给出了正确的值。

当结果值超出int的范围(即大于INT_MAX或小于INT_MIN)时使用atoi会导致未定义的行为。

这是不使用atoi的一个很好的理由。C库中的备选strtolstrtoul对所有输入都有良好定义的行为。

c++ 11函数std::stoi也有定义良好的行为(如果值超出范围,它会抛出异常)。istream::operator>>(int&)也定义良好,但它有一些与流不能"向前看"有关的繁琐细节。

对大于INT_MAX的数字使用atoi将导致结果值从负值INT_MIN开始

尝试使用环礁函数。它在中。但这是在c++ 11中定义的。所以,如果你的编译器不是最新的,它会抛出一个错误。

如果该值又相当大(大于8字节),那么我建议您使用外部库

输入10^10超出了整数2147483648的最大限制,而10^9完全在限制之内。

下面的代码可能很有用。

using namespace std;
#include <iostream>
#include <stdlib.h>
int main(int argc, char* argv[])
{
    long long N = atoll (argv[1]);
    cout << N << endl;
    return 0;
}