数据类型的限制

limit of the data type

本文关键字:数据类型      更新时间:2023-10-16

以下代码为某些值打印错误的输出,而为其他值打印正确的输出。例如,699838110的输出2938640281442109880,而它应该2938640272852175288

#include <iostream>
#include<cmath>
using namespace std;
int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        int d;
        cin>>d;
        if(d==1)
        {
            cout<<1<<endl;
        }
        else
        {
            long long int y=pow(d,2);
            long long int x=8+6*y-12*d;
            cout<<x<<endl;
        }
    }
    return 0;
}

发生这种情况是因为数据类型 long long int 的限制吗?如果不是定义 x,而是直接在我的 cout 语句中写 8+6*d*d-12*d,然后生成一个垃圾值。这是否意味着 cout 语句有限制。如果是,那么这个限制是什么,还是由计算中涉及的变量的数据类型决定?

12*d将计算为int,而不是long long int。 事实上,它在更大的表达式中产生了long long int并没有改变这一点。

如果您的int是 32 位的,则12*d将溢出。 这是不确定的行为。 实际上,int不需要表示大于32767的值,即使 32 位整数(能够容纳大约 2147483647 左右的值)在实践中更为常见。

所以你的问题与流的限制无关。 它与表达式中的变量和结果类型有关。

pow(d,2)表达式 - 使用 std::p ow - 涉及浮点计算(可能是 IEEE 浮点数,d转换为 double,因此有 53 位尾数)。阅读 http://floating-point.de/

最好避免这种情况,并执行以下操作:

  long long int y= d*d;

甚至更好

  long long int y = ((long long)d)* d;

这样平方发生在 64 位算术中这可能会稍微快一些,更准确。

顺便说一句,您应该已经编译了所有警告和调试信息(如果使用GCC g++ -Wall -Wextra -g...),并在调试器中逐步运行程序(gdb)。这肯定会帮助您自己找到错误。

请尝试以下操作。我相信"d"变量需要很长。

int main() {
    long long n;
    cin>>n;
    for(long long i=0LL; i<n; i++)
    {
        long long d;
        cin>>d;
        if(d==1)
        {
            cout<<1<<endl;
        }
        else
        {
            long long y=d*d;
            long long x=8LL+6LL*y-12LL*d;
            cout<<x<<endl;
        }
    }
    return 0;
}

学分:@Basile斯塔林克维奇