Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么一个双精度曲线应该是正的时候却是负的?_C++_Types - Fatal编程技术网

C++ 为什么一个双精度曲线应该是正的时候却是负的?

C++ 为什么一个双精度曲线应该是正的时候却是负的?,c++,types,C++,Types,我想创建一个应用程序,生成满足equatation要求的完整电话号码列表: x是一个有理数 我们可以假设 现在,经过一些转换,我们得到 由于电话号码是整数,10^9是整数,我们知道t*666333999/s是整数。因此,s是t*666333999 到目前为止,我的程序搜索666333999的所有除数。我认为它应该做得很好(它应该写下大部分电话号码)。不幸的是,有时我的电话号码(它是tym变量)是负数 为什么会这样 这是我的密码 #include <iostream> #incl

我想创建一个应用程序,生成满足equatation要求的完整电话号码列表:

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
常量可能就是它。