在双点算术中,尽量避免四舍五入,因为超过了双点,所以不能
Trying to avoid rounding in double point arithmetic, unable to as double is exceeded
我正试图首先用蛮力解决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++;
}
}
}
}
}
}
如注释中所述,如果h
和b
都是整数类型,则如果h
或b
为偶数,则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)
是否是真答案是微不足道的。
相关文章:
- 使用 std::istream_iterator 时,它似乎跳过了空文件行 - 如果可能的话,如何避免这种情况?
- C++ For Loop在过程中被跳过了.如何解决?
- C++跳过了辛线
- 如何在我的代码中修复无穷循环?我认为它跳过了第二个CIN,因此它一直在循环
- QT Qtimeline跳过了第一个框架
- 输入后,我的程序似乎跳过了第一个IF语句,直接转到ELSE
- C RLE BMP压缩跳过了最后一个字节
- 提升单元测试似乎跳过了应执行的代码
- C 将数据读取到一个结构,但它跳过了我的一个获取线,使该元素空白
- 为什么我的程序跳过了一个步骤
- 当我采用测试用例数 = 1 时,我的程序终止.其他明智的是,它给出了正确的答案,但跳过了最后一个测试用例
- 为什么我的代码跳过了这个循环
- 请解释:在 for 循环之后跳过了行
- C++编译器似乎跳过了代码行
- 跳过了 int* 的琐碎分配
- GLSL交错似乎在3DTV上甚至跳过了行
- std::basic_regex<char32_t>,有人已经尝试过了吗?
- 我可以使用' == '来比较两个向量吗?我试过了,似乎工作正常。但我不知道它是否适用于更复杂的情况
- c++ cin.Getline似乎被跳过了
- 为什么while循环被跳过了