Программа на C++ работает правильно, а на Pascal нет

294
14 июня 2017, 02:40

pascal:

//fpc 3.0.0    
program HelloWorld;
var x:double;
function fact(n:integer):integer;
begin
  if(n = 0) then fact := 1
  else fact := n*fact(n-1);
end;
function pows(x:double;y:integer):double;
begin
  if(y = 0) then pows := 1
  else pows := x*pows(x,y-1);
end;
function func(x:double):double;
var n:integer;
begin
   n:= 8;
   func := pows(-1,n)*pows(x,2*n+1)/(fact(n)*(2*n+1));
end;
begin
    x := func(2);
    write(x);
end.

Результат: x = -0.30576

C++

//g++  5.4.0
#include <iostream>
using namespace std;
int fact (int i){
    return (!i)?1:i*fact(i-1);
}
double pows(double x,int y){
    return (!y)?1:x*pows(x,y-1);
}
double func(double x){
    int n = 8;
    return pows(-1,n)*pows(x,2*n+1)/(fact(n)*(2*n+1));
}
int main()
{
    double x = func(2);
    cout<<x<<endl;
}

Результат: x = 0.191223;

Я конечно понимаю что побочные функции есть в модулях cmath и math но не суть важно, ответ совпадает до n = 7 а дальше сами видите. В общем ошибка помоему тривиальна, но если поможете её найти, буду благодарен.

Answer 1

Потому что в С++ int обычно не меньше 32 бит (вряд ли вы 16 бит найдёте), а в Паскале integer именно 16 бит. Вместо него следует использовать LongInt или int64/QWord

Из-за возникновения переполнения результаты отличаются.

UPD. В паскале это зависит от настроек компилятора, битности компилятора и системы. В С++ примерно так же. 16 бит для паскаля - значение по умолчанию. В С++ обычно на 32 бита можно рассчитывать. Чтобы избегать подобного советую всегда использовать типы с точным размером.

READ ALSO
Странный конфликт jQuery и Google Chrome Api

Странный конфликт jQuery и Google Chrome Api

Столкнулся со странными поведением JQ и хрома, а именно, в консоль выдает следующие ошибки:

357
Управление обработчиком [требует правки]

Управление обработчиком [требует правки]

Есть обработчикbind, обрабатывает от scroll, как выполнять другие функции если: скроллишь вверх, вниз или не скроллишь

231
Как отловить событеие submit через addEventListener?

Как отловить событеие submit через addEventListener?

пытаюсь добавить передаваемые данные при отправке формы пост собствено вот форма

458