在 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 总和,结果为零。