Java c++;连分数输出错误
我编写了这段Java代码,效果非常好:Java c++;连分数输出错误,java,c++,c++14,Java,C++,C++14,我编写了这段Java代码,效果非常好: static String getFraction(double x) { double limit = 1.0E-6; double h1 = 1, h2 = 0, k1 = 0, k2 = 1; double y = x; do { double a = Math.floor(y); double aux = h1;
static String getFraction(double x) {
double limit = 1.0E-6;
double h1 = 1, h2 = 0, k1 = 0, k2 = 1;
double y = x;
do {
double a = Math.floor(y);
double aux = h1;
h1 = a*h1+h2;
h2 = aux;
aux = k1;
k1 = a*k1+k2;
k2 = aux;
y = 1/(y-a);
} while (Math.abs(x-h1/k1) > x*limit );
return ((int) h1) + "/" + ((int) k1);
}
它采用双精度(6.45)并使用连分数(129/20)返回其分数表示形式。这是C++代码:
void calc(double x) {
double limit = 1.0E-6;
double h1 = 1, h2 = 0, k1 = 0, k2 = 1;
double y = x;
do {
double a = floor(y);
double aux = h1;
h1 = a*h1+h2;
h2 = aux;
aux = k1;
k1 = a*k1+k2;
k2 = aux;
y = 1/(y-a);
} while (abs(x-h1/k1) > x*limit );
std::cout << (h1) << "/" << (k1) << std::endl;
}
有什么想法吗?我是否必须将某些内容静态强制转换为双精度以允许浮点操作?该函数返回一个
int
,该值将为0
。如果要使用或,则后者对整型和浮点型都有重载 该函数返回一个int
,它将是0
。如果要使用或,则后者对整型和浮点型都有重载 问题在于abs()
函数。我过去也有过类似的问题。请看以下代码:
int main() {
std::cout << abs(-85.5) << std::endl;
}
问题在于
abs()
功能。我过去也有过类似的问题。请看以下代码:
int main() {
std::cout << abs(-85.5) << std::endl;
}
事实上,我首先制作了C++版本,我浪费了很多时间。然后我尝试了Java,它成功了。我不能理解我在C++部分哪里错了!您是否在执行过程中使用调试器逐步完成了代码?如果我将“我猜,这是因为java和C++实现之间浮点格式的不同。但这并不是一个真正的答案。有一个著名的用户,所以谁喜欢Burman,这可能是希望回答。事实是,我生产了一个C++版本第一,我“浪费”了很多时间。然后我尝试了Java,它成功了。我不能理解我在C++部分哪里错了!您是否在执行过程中使用调试器逐步完成了代码?如果我将“我猜,这是因为java和C++实现之间浮点格式的不同。但这并不是一个真正的答案。SO上有一位杰出的用户,他喜欢Birmans,这可能是一个很有希望的答案。请告诉我,有什么人会对这一点投反对票?@Storytler:我没有,但我认为这个答案是错的<代码>标准::abs(双精度)返回双精度
std::abs(int)
返回int。OP显然通过了double。@Jaa-c-std::abs
可以,而::abs
不能。看看OP的代码。我很确定它们包含了math.h
而不是cmath
@StoryTeller:哦,我错过了。std:
前缀是由一位编辑添加的,并且使答案不正确,我刚刚删除了它们。请问,有什么原因可以让任何人对此投反对票?@StoryTeller:我没有,但我觉得这个答案错了<代码>标准::abs(双精度)返回双精度std::abs(int)
返回int。OP显然通过了double。@Jaa-c-std::abs
可以,而::abs
不能。看看OP的代码。我很确定它们包含了math.h
而不是cmath
@StoryTeller:哦,我错过了。std::
前缀是由编辑添加的,导致答案不正确,我刚刚删除了它们
double c;
do {
double a = floor(y);
double aux = h1;
h1 = a*h1+h2;
h2 = aux;
aux = k1;
k1 = a*k1+k2;
k2 = aux;
y = 1/(y-a);
if ((x-h1/k1) >= 0)
c = x-h1/k1;
else
c = -(x-h1/k1);
} while (c > x*limit );