以下代码为某些值打印错误输出,而其他值正确。 例如,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 int? 如果不是定义x,我会立即在我的cout语句中写入8 + 6 * d * d-12 * d,然后生成一个垃圾值。这是否意味着cout语句有限制。如果是,那么该限制是什么,还是由计算中涉及的变量的数据类型决定的?
答案 0 :(得分:2)
12*d
将计算为int
,而不是long long int
。事实上,它在一个更大的表达式中产生long long int
并不会改变它。
如果int
为32位,则12*d
将溢出。这是未定义的行为。实际上,int
不需要表示大于32767
的值,即使32位整数(能够保存大约2147483647
左右的值)在实践中更常见。 / p>
所以你的问题与流的限制无关。它与表达式中的变量和结果类型有关。
答案 1 :(得分:2)
pow(d,2)
表达式 - 使用std::pow - 涉及浮点计算(可能IEEE floating point,d
转换为double
,因此53位尾数)。阅读http://floating-point.de/
最好避免这样做并做:
long long int y= d*d;
甚至更好
long long int y = ((long long)d)* d;
使得平方发生在64位算术中 这可能会更快,更准确。
顺便说一句,你应该编译所有的警告&amp;调试信息(g++ -Wall -Wextra -g
如果使用GCC ...)并在调试器(gdb
)中逐步运行您的程序。这肯定会帮助你自己找到这个bug。
答案 2 :(得分:1)
尝试以下方法。我认为“d”变量需要很长时间。
class Jukebox {
private Song[][] songList;
public Jukebox() {
songList = new Song[3][4];
songList[0][0] = new Song("Jet Airliner", 5);
songList[0][1] = new Song("Slide", 4);
songList[0][2] = new Song("Tom Sawyer", 3);
songList[0][3] = new Song("Purple Rain", 2);
songList[1][0] = new Song("Sing a Song", 1);
songList[1][1] = new Song("Baba O'Riley", 5);
songList[1][2] = new Song("Jumper", 4);
songList[1][3] = new Song("Car Wash", 3);
songList[2][0] = new Song("Kung Fu Fighting", 2);
songList[2][1] = new Song("Right as Rain", 4);
songList[2][2] = new Song("Beat It", 5);
songList[2][3] = new Song("Bust a Move", 4);
}
public String toString() {
String output = " ";
for (int row = 0; row < songList.length; row++) {
for (int col = 0; col < songList[row].length; col++) {
output += (songList[row][col]);
}
output += "\n";
}
return output;
}
}
信用:@Basile Starynkevitch