[FreePascal]Longint nie obsługuje dzielenia

program test;

uses crt;

var

a,b,c:longint;


begin

		b:=1000000;

		c:=5790;

		a:=b/c;

		writeln(a);

		readln;

end.

program.pas(9,13) Error: Incompatible types: got "Extended" expected "LongInt"

program.pas(12,4) Fatal: There were 1 errors compiling module, stopping

program.pas(0) Fatal: Compilation aborted

Dodawanie działa, odejmowanie, mnożenie, dzielenie NIE działa. Gdy longint zmienię na real to działa dzielenie…

http://www.google.pl/search?hl=pl&q=pas … =&aq=f&oq=

Spróbuj obydwie dane rzutować na longint

a musi być jako extended {a przynajmniej jako typ zmiennej real} bo inaczej ci dzielenie nie pójdzie

program test;

uses crt;

var

a:extended;

b,c:longint;


begin

Write('podaj liczby b i c oddzielając je spacją');

readln(b,c);{'c' nie może być równe 0}

a:=b/c;  

    writeln(a);

      readkey;

end.

Do dzielenia liczb całkowitych w pascalu używa się poleceń:

div - dzielenie

mod - reszta z dzielenia

operator / będzie działał tylko na liczbach rzeczywistych.

Pozdrawiam,

jrap3

nie wiem od kiedy ja uzywam do dzielenia zawsze “/” i robi dobrze

Lub tez:

program test;

uses crt;

var a,b,c:longint;


begin

    b:=11;

    c:=3;

    a:=trunc(b/c); // to samo co a:=b div c; tylko że dłuższe w czasie

    writeln(a);

    a:=longint(b/c); // to samo co a:=b div c; tylko że dłuższe w czasie

    writeln(a);

    a:=round(b/c); // a tu zaokrąglenie na ile pamiętam do najbliższej parzystej

    writeln(a);

    a:=longint(floor(b/c+0.5)); // a tu zaokrąglenie znane ze szkoły

    writeln(a);

    readkey;

end.

Tak, a propos nazwy tematu, żaden z typów danych dla żadnego języka nie obsługuje dzielenia, dla obsługi dzielenia przeważnie istnieje operator / w pascalu jest jeszcze operator div.

W twoim przykładzie kompilator nie chciał przyjąć nie samego dzielenia, zaś nie chciał przyjąć przypisania do longint wartości zmiennoprzecinkowej.

Dzięki za wytłumaczenie. Nie rozumiem tego rzutowania, ale kiedyś może do tego dojdę, na razie obejdę sie chyba bez ;/

Do czego dokładniej służy extended- tzn kiedy sie to stosuje? <-EDYCJA: już znalazłem co to jest i do czego ;D

Hmm, jeśli lepiej użyć np real to po co jest longint i inne?

program test;

uses crt;

var a,b,c:longint;


begin

    b:=11;

    c:=3;

    a:=trunc(b/c); // to samo co a:=b div c; tylko że dłuższe w czasie

    writeln(a);

    a:=longint(b/c); // to samo co a:=b div c; tylko że dłuższe w czasie

    writeln(a);

    a:=round(b/c); // a tu zaokrąglenie na ile pamiętam do najbliższej parzystej

    writeln(a);

    a:=longint(floor(b/c+0.5)); // a tu zaokrąglenie znane ze szkoły

    writeln(a);

    readkey;

end.

Nie działa, nie mam pojęcia co jest źle:

Recompiling because of D:\FPC\2.2.2\bin\program.pas

program.pas(10,8) Error: Illegal type conversion: "Extended" to "LongInt"

program.pas(14,21) Error: Identifier not found "floor"

program.pas(17,4) Fatal: There were 2 errors compiling module, stopping

program.pas(0) Fatal: Compilation aborted

O co chodzi w tym że dłuższe w czasie? Mam też taki problem:

var

a,b,c:real;


begin

        b:=1234567890123456789012345678901234567890;

        c:=2;

        a:=b/c;

        writeln(a:1:2);

end.

Wynik: 6.17283945061728E+038

Co zrobić by wyświetlało większą liczbę?

Drugi problem- dlaczego mając małą liczbę (bo jest obsługiwana już poprawnie jeśli dołożę kilka zer): 12345678901234567890 źle ją oblicza? - dzieląc ją przez 2 otrzymuję minusową liczbę i do tego nie poprawną nawet jeśli zabrać minus (-3050532586237490000.00).

Gdy do 12345678901234567890 dodam jedno 0 i jest 123456789012345678900 to już jest wynik prawidłowy i dodatni czyli 61728394506172800000.00

Zapomniałem że sobie dołożyłem kilka użytecznych funkcji a la Delphi :lol:

program test;

uses crt;

var a,b,c:longint;


begin

    b:=18;

    c:=4;

    a:=trunc(b/c); // to samo co a:=b div c; tylko że dłuższe w czasie

    writeln(a);

    a:=round(b/c); // a tu zaokrąglenie na ile pamiętam do najbliższej parzystej

    writeln(a);

    a:=trunc(b/c+0.5); // a tu zaokrąglenie znane ze szkoły

    writeln(a);

    readkey;

end.

To już się kompiluje.

Każdy z typów danych w każdym języku ma swoje ograniczenia.

np tu są opisane: http://turbo-pascal.lubi.pl/l3.htm

Jeżeli w wyniku obliczeń liczba nie mieści się w swoich przydziałach to następuje przepełnienie.

Dla operacji na większych liczbach trzeba napisać samemu odpowiednie procedury lub szukać gotowych bibliotek.

Dzięki, przemyśle ten kod. Strona też ciekawa (tylko ten niebieski po oczach bije, w pascalu jest bardziej stonowany), nie trafiłem jeszcze na tę stronę.

Przy zastosowaniu real, double lub extended dla b:=1234567890123456789012345678901234567 wynik (zapis) dzielenia przez 2 jest poprawny ale już jeśli jest liczba z większą ilością cyfr to jest problem i wyświetla np tak wynik 6.17283945061728E+036 <-A przecież mieści sie w zakresie liczba… więc w czym problem?

A liczba 12345678901234567890 mieści sie w zakresie real, double oraz extended, a wynik dzielenia tej liczby przez 2 jest ujemny przy real, double i przy extended. Chyba problemem jest to że jest 20 cyfrowa liczba bo jeśli ejst 19 cyfrowa lub 21 cyfrowa to jest wszystko dobrze…

P.S. Nie wiem czemu ale nie działa u mnie typ comp.

Z formatami zmiennoprzecinkowymi jest jeszcze problem z ilością znaków znaczących.

Owszem mieści się w zakres ale już zaokrągla na ostatnie cyfry.

Poczytaj na temat zapisu “naukowego”, 6.17283945061728E+036 - oznacza 6.17283945061728 * 10^36

Teraz widzę że jednak do 18 cyfr liczby b, wyświetla poprawnie wynik podzielonego tego b, dalej końcówka liczby jest zła np dla b:=1234567890123456789 podzielonego przez 2 wynik to 617283945061728390, dla 20- cyfrowego b wynik jest ujemny a dla innych nie i dlatego myślałem że reszta (większa liczba)jest poprawna. Dziwne bo extended powinno umożliwiać poprawne wyliczenie takich liczb.

Da sie coś zrobić by nie zaokrąglało?

Tylko w Pascalu są takie problemy różne czy w c/c++ i innych językach też?

Przepełnienie i zaokrąglenie dotyczy wszystkich jeżyków programowania.

Dla operacji na większych liczbach trzeba napisać samemu odpowiednie procedury lub szukać gotowych bibliotek.