Błąd SIGFPE przy wywołaniu funkcji power - Lazarus 1.44.

0

Witam,

Potrzebowałem w swoim programie użyć funkcji power, ale kompilator krzyczał, że nie rozpoznaje funkcji 'power'. Dodałem więc w deklaracji uses 'math' i zadziałało, problem w tym, że tylko częściowo. Gdy próbuję podnieść 10 do potęgi 0,1,2,3 wszystko jest ok, ale jak do potęgi 4 i więcej to już program się sypie.

Oto mój programik:

procedure TForm1.Button2Click(Sender: TObject);
 var
   rzad: integer;
   x: extended;
begin
  rzad:= StrToInt(Edit1.Text);
  x:= power(10,rzad);
  ShowMessage(FloatToStr(x));
end; 

Błąd który wyskakuje brzmi dokładnie:

Project project1 raised exception class 'External: SIGFPE'. At adress 449883.

Po czym wyskakuje mi okienko Assembler z modułem math? a linia 449883 ma wartości

db7d08 fstpt 0x8 (%ebp)

Cokolwiek to znaczy.

3

Stawiam na przekroczenie zakresu.

Byte - 0 .. 255
Shortint - -128 .. 127
Smallint - -32768 .. 32767
Word - 0 .. 65535
Integer - smallint or longint
Cardinal - longword
Longint - -2147483648 .. 2147483647
Longword - 0..4294967295
Int64 - -9223372036854775808 .. 9223372036854775807
QWord - 0 .. 18446744073709551615

Zasięg typów.

Nie wiem jaką liczbę chcesz podnieść do 10 potęgi ale już liczba 3 przekracza zakres Integer. Zmień typ albo przemyśl jeszcze raz to co chcesz zrobić.

Dobra teraz dopatrzyłem, że używasz extended i może pomieścić dużą liczbę, jednak dalej stawiał bym na przekroczenie zakresu

0

A co masz wpisane w Edit1.Text?
dd31d9a90f.png

0

No właśnie jak wpisuje 4 albo więcej to wtedy się crashuje, a jak 0,1,2 i 3 to wszystko jest w porządku.

0

Podaj pełny kod projektu, wg mnie problem leży gdzie indziej.

0
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, math;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button2: TButton;
    Edit1: TEdit;
    Label2: TLabel;
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button2Click(Sender: TObject);
 var
   rzad:extended;
   x:extended;
   los:extended;
begin
  rzad:=StrToInt(Edit1.Text);
  x:=power(10,rzad);
  los:=random(round(x+1))/power(10,x);
  ShowMessage(FloatToStr(los));
end;

end.
0

Więc radzę odinstalować i zainstalować ponownie lazarusa.

0

Spójrz jeszcze raz. Wstawiłem niechcący nie ten kod, teraz zedytowałem.

4

Bo przy rzad=4 próbujesz policzyć 1010000:

x:=power(10,rzad);
... power(10,x); // tu

zaś więcej niż 10^ 4932 nie da się policzyć.

2

Dla rząd = 4 wychodzi Ci już przecież tam 10^(10^4) - jakim cudem chcesz taką liczbę pomieścić w Extended? :|

0

Cholera rzeczywiście, tam powinno być

los:=random(round(x+1))/power(10,rzad)

albo

los:=random(round(x+1))/x

Jak mogłem być tak ślepy?
No cóż, dzięki Panowie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1