在双点算术中,尽量避免四舍五入,因为超过了双点,所以不能

Trying to avoid rounding in double point arithmetic, unable to as double is exceeded

本文关键字:过了 因为 不能 四舍五入      更新时间:2023-10-16

我正试图首先用蛮力解决Project Euler 94。这需要我计算出给定三角形的一个面积是否为整数。我知道底部和高度,它们都是积分。

long double area = 0.5*h*b;

当使用double点算术时,我得到的答案超过了指数,并牺牲了分数的精度。我有没有办法忽略指数的最重要部分,只关注分数,因为我只关心面积是否是整数,而不是它的大小。此外,我使用的Visual Studio我认为它没有long double,只有double

编辑

这是我的代码。它将错误三角形的数量从26个减少到23个,减少了3个。

编辑2

我已经阅读了每个人的建议,但我仍然无法过滤掉不完整的高度。我的最新代码是这样的。我知道我在做一些非常愚蠢的事情,但就是无法确定。

    void findAET(){
    int gt = 0; //triangle count is
    for(long long ss  = 3; ss<333333334;ss+=2){ //skips out odd bases
     for(int c = -1; c<2; c+=2){ 
      long long base = c + ss;      
        if((sqrt((ss*ss)-(double)((base/2)*(base/2)))) == int(sqrt(((ss*ss))-(double)((base/2)*(base/2)))) ){  // check if height is an integer
            if( (int)((sqrt((ss*ss)-(double)((base/2)*(base/2))))*base)%2==0){
                cout<<" same sides "<<ss<<" base "<< base <<endl;                       
                gt++;
                    }
                }
            }
        }
    }
}

如注释中所述,如果hb都是整数类型,则如果hb为偶数,则0.5*h*b具有整数结果:

if (((h % 2) == 0) || ((b % 2) == 0)) {
    printf("area is integraln");
} else {
    printf("area is not integraln");
}

如果(b * h) % 2 == 0,那么我们知道(b * h) / 2将是一个整数结果。那么您只需要一个整数数据类型。我不知道你需要计算多大的数字,但long long在64位时可以容纳9223372036854775807

// Returns zero if height is not an integer
// Returns exact height if there is an exact height 
// Relies on unsigned having at least 30 bits and long long at least 61
unsigned find_height( unsigned x, unsigned y){
    if ( y & 1 ) return 0;  // Height is not an integer because height squared is not
    long long hs = (long long)x*x - (long long)y*y/4;
    unsigned result = sqrt(hs) + .5;
    if ( (long long)result*result != hs ) return 0;
    return result;
}

如果用这种方式计算高度,就不需要对面积进行任何整数测试。当高度为整数时,面积将为整数。

对于60位整数输入,sqrt(double)足够精确,当真实答案是整数时,最接近的整数将是正确的整数。但是,由于60位整数不能真正保存在double中,因此从真实答案是否为整数的角度来看,检验sqrt(double)的结果是否为整数在任何一个方向上都可能是不正确的。但是,仅仅通过平方和比较来找出最接近的整数(unsigned)(D+.5)是否是真答案是微不足道的。