为什么一个应该是正数的双精度浮点数会变成负数?

3

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

Equatation

x是一个有理数。

我们可以假设

x=s/t

现在,在进行一些转换后,我们得到

Equatation

由于电话号码是整数,10^9是整数,我们知道t*666333999/s是整数。 因此,st * 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;
            }
        }
    }
}

1
溢出了。加一个负值检查吗? - Elliott Frisch
5
对于这个练习,我建议避免使用浮点数运算,而是使用64位整数进行计算。32位整数无法存储完整的9位数范围,但64位整数可以。 - Joe Z
此外,您应该考虑使用最大公约数(GCD)的概念。有非常高效的算法可以计算它,而且谷歌会帮助您找到它们。 - Joe Z
@JoeZ 我开始倾向于使用浮点数学,你比我更快地想到了它。 - SQLMason
@ElliottFrisch - 检查在第if(tym > 99999999 && tym < 2000000000) // I must substract 10^9行。 - enedil
显示剩余5条评论
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
3

你计算所涉及的数字超出了32位整数的能力范围,但可能适合64位整数。

也许在你的平台上,int 是32位的。只需使用long long

如果你想确保使用64位,请使用在<cstdint>中定义的std::int64_t


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,