数据类型的限制
limit of the data type
以下代码为某些值打印错误的输出,而为其他值打印正确的输出。例如,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斯塔林克维奇
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在C++中打印指向不同基元数据类型的指针的内存地址
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何计算数据类型的范围,例如int
- C++中数据类型修饰符的顺序
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 特定数据类型的模板类
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 有没有办法提示用户使用哪种数据类型作为模板 c++
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何获取C++字符数据类型的地址
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 构造智能点数据类型以及普通数据类型的通用方法
- 如何使映射键具有两种不同的数据类型?
- 数据类型"struct seq<0, 1, 2>{}"含义是什么?
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- Static_cast转换为错误的数据类型,但结果仍然正确?
- 使用 Boost.Spirit 解析具有混合数据类型的 OBJ 文件?