C++ 为什么一个双精度曲线应该是正的时候却是负的?
我想创建一个应用程序,生成满足equatation要求的完整电话号码列表:C++ 为什么一个双精度曲线应该是正的时候却是负的?,c++,types,C++,Types,我想创建一个应用程序,生成满足equatation要求的完整电话号码列表: x是一个有理数 我们可以假设 现在,经过一些转换,我们得到 由于电话号码是整数,10^9是整数,我们知道t*666333999/s是整数。因此,s是t*666333999 到目前为止,我的程序搜索666333999的所有除数。我认为它应该做得很好(它应该写下大部分电话号码)。不幸的是,有时我的电话号码(它是tym变量)是负数 为什么会这样 这是我的密码 #include <iostream> #incl
x
是一个有理数
我们可以假设
现在,经过一些转换,我们得到
由于电话号码是整数,10^9
是整数,我们知道t*666333999/s
是整数。因此,s
是t*666333999
到目前为止,我的程序搜索666333999的所有除数。我认为它应该做得很好(它应该写下大部分电话号码)。不幸的是,有时我的电话号码(它是tym
变量)是负数
为什么会这样
这是我的密码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector < unsigned > divisor;
const int number = 666333999;
long double tym; // it's the phone number (9 digits)
for (int i = 2; i < number + 1; i++)
{ // I'm pushing all the divisors to vector.
if (number % i == 0)
{
divisor.push_back(i);
}
}
for(unsigned i = 1; i < divisor.size() + 1; i++)
{ // i are consecutives values of s
for(unsigned j = 1; j < (unsigned)2000000000; j++)
{ // j are consecutives values of t
tym = number / divisor[i];
tym *= j;
if(tym > 99999999 && tym < 2000000000) // I must substract 10^9
{
cout << "\t(!)\t i = " << i << " and j = " << j << ","
"div[i] = " << divisor[i] << ", telephone"
" number = " << (tym - 1000000000) << endl;
}
else if(tym >= 2000000000)
{
break;
}
}
}
}
#包括
#包括
使用名称空间std;
int main()
{
向量<无符号>除数;
常数整数=666333999;
long double tym;//是电话号码(9位)
对于(int i=2;i9999999&&tym<2000000000)//我必须减去10^9
{
cout计算中涉及的数字超出了32位整数的能力,但可能适合64位整数
可能在您的平台中int
为32位。只需使用long
如果您想确定64位,请使用<代码> STD::Inth6xt < /C> >在“代码> > /代码> < /P>中溢出。添加负值检查。我将避免浮点运算,使用64位整数。32位整数将不包含9位数字的全范围,但64位将。还应考虑使用最大公约数概念(GCD)。有非常有效的算法来计算它,谷歌会帮你找到它们。@JoeZ我开始倾向于浮点数学。你比我强。@JoeZ,
double
可以毫无损失地保存任何53位整数。我怀疑这是问题的根源。不过,这个大的int
常量可能就是它。