在 Pascal 中使用矩形方法计算积分给出 0,而在 C++ 中结果良好
Calculate integral using rectangle method in Pascal gives 0 while in C++ good results
我正在尝试在 Pascal 中实现矩形方法。关键是,我得到了错误的结果。我得到 0,而 C++ 中的相同代码给了我很好的结果。这是为什么?谢谢
帕斯卡:
Program HelloWorld(output);
function degrees2radians(x: real) : real;
var
result: real;
begin
result := x * 3.14159 / 180.0;
end;
function fun1(x: real) : real;
var
result: real;
begin
x := degrees2radians(x);
result := Sin(x);
end;
function rect_method(a: real; b: real; n: integer) : real;
var
result: real;
h: real;
integral: real;
i : integer;
begin
integral := 0;
i := 0;
h := (a - b) / n;
for i := 1 to n do
begin
integral := integral + fun1(b + i*h)*h;
end;
result := integral;
end;
var
result: real;
begin
result := rect_method(1.0, -2.0, 3);
writeln('result = ', result);
end.
和 C++(有效:https://onlinegdb.com/ubuNQInB2):
#include <iostream>
#include <cstdlib>
#include <cmath>
double degrees2radians(double x)
{
return x * 3.14159 / 180;
}
double f1(double x)
{
x = degrees2radians(x);
return sin(x);
}
double rectangle_method(double a, double b, int n)
{
float h, integral = 0;
h = (a - b) / (double) n;
for (int i=1; i<=n; i++)
integral += f1(b + i*h)*h;
return integral;
}
int main()
{
std::cout << rectangle_method(1, -2, 3) << "\n";
return 0;
}
在您的 Pascal 代码中 result
是一个局部变量,与您要使用的 the special identifier called result
无关:
function degrees2radians(x: real) : real;
var
result: real;
begin
result := x * 3.14159 / 180.0;
end;
您应该删除所有函数中的 result: real;
。
但是,“固定”代码无论如何都会产生零:https://onlinegdb.com/_M2pGk134,这实际上是正确的。也就是说,此代码应 return 零。
我用Julia重写了这段代码(语言无所谓,关键是它支持开箱即用的高精度浮点类型;BigFloat
就是这样的高精度float) ,结果还是零:
degrees2radians(x::Real)::Real = x * 3.14159 / 180
f1(x::Real) = sin(degrees2radians(x))
function rectangle_method(a::Real, b::Real, n::Integer)
integral = 0
h = (a - b) / n;
for i in 1:n
@show i f1(b + i*h)*h
integral += f1(b + i*h)*h;
end
return integral;
end
@show rectangle_method(BigFloat("1"), -BigFloat("2"), 3)
输出如下所示:
i = 1
f1(b + i * h) * h = -0.01745239169736329549313317881927049082689975241899824937795751704833664190229729
i = 2
f1(b + i * h) * h = 0.0
i = 3
f1(b + i * h) * h = 0.01745239169736329549313317881927049082689975241899824937795751704833664190229729
rectangle_method(BigFloat("1"), -(BigFloat("2")), 3) = 0.0
所以,f1(b + 2 * h) * h
为零,f1(b + 1 * h) * h
正好(看小数点后的位数!)[的负数=19=],因此它们抵消了 integral
总和,结果为零。
我正在尝试在 Pascal 中实现矩形方法。关键是,我得到了错误的结果。我得到 0,而 C++ 中的相同代码给了我很好的结果。这是为什么?谢谢
帕斯卡:
Program HelloWorld(output);
function degrees2radians(x: real) : real;
var
result: real;
begin
result := x * 3.14159 / 180.0;
end;
function fun1(x: real) : real;
var
result: real;
begin
x := degrees2radians(x);
result := Sin(x);
end;
function rect_method(a: real; b: real; n: integer) : real;
var
result: real;
h: real;
integral: real;
i : integer;
begin
integral := 0;
i := 0;
h := (a - b) / n;
for i := 1 to n do
begin
integral := integral + fun1(b + i*h)*h;
end;
result := integral;
end;
var
result: real;
begin
result := rect_method(1.0, -2.0, 3);
writeln('result = ', result);
end.
和 C++(有效:https://onlinegdb.com/ubuNQInB2):
#include <iostream>
#include <cstdlib>
#include <cmath>
double degrees2radians(double x)
{
return x * 3.14159 / 180;
}
double f1(double x)
{
x = degrees2radians(x);
return sin(x);
}
double rectangle_method(double a, double b, int n)
{
float h, integral = 0;
h = (a - b) / (double) n;
for (int i=1; i<=n; i++)
integral += f1(b + i*h)*h;
return integral;
}
int main()
{
std::cout << rectangle_method(1, -2, 3) << "\n";
return 0;
}
在您的 Pascal 代码中 result
是一个局部变量,与您要使用的 the special identifier called result
无关:
function degrees2radians(x: real) : real;
var
result: real;
begin
result := x * 3.14159 / 180.0;
end;
您应该删除所有函数中的 result: real;
。
但是,“固定”代码无论如何都会产生零:https://onlinegdb.com/_M2pGk134,这实际上是正确的。也就是说,此代码应 return 零。
我用Julia重写了这段代码(语言无所谓,关键是它支持开箱即用的高精度浮点类型;BigFloat
就是这样的高精度float) ,结果还是零:
degrees2radians(x::Real)::Real = x * 3.14159 / 180
f1(x::Real) = sin(degrees2radians(x))
function rectangle_method(a::Real, b::Real, n::Integer)
integral = 0
h = (a - b) / n;
for i in 1:n
@show i f1(b + i*h)*h
integral += f1(b + i*h)*h;
end
return integral;
end
@show rectangle_method(BigFloat("1"), -BigFloat("2"), 3)
输出如下所示:
i = 1
f1(b + i * h) * h = -0.01745239169736329549313317881927049082689975241899824937795751704833664190229729
i = 2
f1(b + i * h) * h = 0.0
i = 3
f1(b + i * h) * h = 0.01745239169736329549313317881927049082689975241899824937795751704833664190229729
rectangle_method(BigFloat("1"), -(BigFloat("2")), 3) = 0.0
所以,f1(b + 2 * h) * h
为零,f1(b + 1 * h) * h
正好(看小数点后的位数!)[的负数=19=],因此它们抵消了 integral
总和,结果为零。