| Author |
Message |
ir1keren |
| Location: |
|
|
Post subject: Floating point overflow->compiler error?
Posted: 12/Mar/2009 16:21
|
|
onConfident
Joined: 22-Nov-2007
Posts: 29
Status: Offline
|
|
Gw bikin aplikasi yang ada looping ky gini:
Code:
for x := 0 to FVertex.Count - 1 do
for i := 0 to FVertex.Count - 1 do
FV[x,i]:=0.5*(1+tanh(fu[x,i]/Fu0));
Fu gw definisikan sbg TDouble2D
Code:
type
TDouble1D=array of Double;
TDouble2D=array of TDouble1D;
Nah pas di-run muncul pesan error "Floating point overflow at 00403230".
Trus gw lacak, nemu error muncul klo
Code:
Fu[x,i] = -12.278243687
dan
Code:
Fu0 = 0.001
Klo pake kalkulator angka2 Fu[x,i]/Fu0 hasilnya: -12278.243687
Nah iseng2 gw pengen tau bil. tsb tipenya (logikanya sih Double), aku trap pake:
Code:
ShowMessage(VarTypeAsText(VarType(fu[x,i]/Fu0)));
Muncul pesan "Double". Bener deh.
Trus gw lacak ke fungsi tanh() yg didefinisikan di unit Math, isinya:
Code:
function Tanh(const X: Extended): Extended;
begin
if IsZero(X) then
Result := 0
else
Result := SinH(X) / CosH(X);
end;
Nah X ternyata tipe-nya extended, yg range nilainya:
-3.6 x 10^4951 .. 1.1 x 10^4932 (ukuran total 10 byte)
Jadi seharusnya lebih besar dari double
Iseng-iseng gw trace pake Evaluate/Modify (F7) masukin:
tanh(-12278.243687)
Eh, muncul pesan "Floating point overflow at 00403230".
Gw pake Evaluate/Modify lg buat ngitung -12.278243687/0.001, hasilnya sama (dan normal-ga ada error), -12278.243687. Knp permasalahannya di fungsi tanh(), padahal parameternya bertipe extended ya? |
|
|
| |
|
|
|
 |
ir1keren |
| Location: |
|
Post subject:
Posted: 13/Mar/2009 08:43
|
|
onConfident
Joined: 22-Nov-2007
Posts: 29
Status: Offline
|
|
welehh..sepi..ato jg sama2 bingun ky aku?  |
|
|
| |
|
|
|
 |
herux |
| Location: Kediri |
|
Post subject:
Posted: 13/Mar/2009 08:49
|
|
onProfessional
Joined: 13-Jul-2006
Posts: 668
Location: Kediri
Status: Offline
|
|
|
|
|
 |
ichan29 |
| Location: |
|
Post subject:
Posted: 13/Mar/2009 09:06
|
|
onProfessional
Joined: 23-Feb-2007
Posts: 603
Status: Offline
|
|
|
ir1keren wrote:
welehh..sepi..ato jg sama2 bingun ky aku?
@ir1keren: tidak selamanya apa yg dikau posting langsung bisa dijawab, coba baca dulu yg ada diperaturan forum ini, bisa aja mereka pd lg sibuk atau mungkin alasan2 yg lain.. jgn terlalu berharap, dan usaha adalah cara yg paling bagus, salah satunya dikau posting masalah ini disini [ini salah satu usaha dikau]
@herux wrote:
: Males mikir ah.....
klo menurutku lebih baik tdk usah coment drpd spt ini, takut menimbulkan salah penafsiran dari sang penanya..
kembali ke topik:
coba lihat: FV[x,i]:=0.5*(1+tanh(fu[x,i]/Fu0));
sementara fungsi tanh jika nilai paramaneter tdk 0 akan meng-eksekusi spt ini: SinH(X) / CosH(X), lalu dikau coba dg cara Evaluate: -12.278243687/0.001 [ini menurut dikau tdk error]
apakah nilai itu merupakan dr SinH dan CosH? bukannya nilai itu cuman nilai dr Fu dan Fu0? jadi itulah yg menyebabkannya. |
|
|
| |
|
|
|
 |
ichan29 |
| Location: |
|
Post subject:
Posted: 13/Mar/2009 09:11
|
|
onProfessional
Joined: 23-Feb-2007
Posts: 603
Status: Offline
|
|
FV[x,i]:=0.5*(1+tanh(fu[x,i]/Fu0));
FV[x,i]:=0.5*(1+(SinH(-12.278243687/0.001)/CosH(-12.278243687/0.001))); |
|
|
| |
|
|
|
 |
ir1keren |
| Location: |
|
Post subject:
Posted: 13/Mar/2009 10:34
|
|
onConfident
Joined: 22-Nov-2007
Posts: 29
Status: Offline
|
|
|
ichan29 wrote:
klo menurutku lebih baik tdk usah coment drpd spt ini, takut menimbulkan salah penafsiran dari sang penanya..
maap deh, klo bikin salah penafsiran kbiasaan ngeblog..
ichan29 wrote:
FV[x,i]:=0.5*(1+tanh(fu[x,i]/Fu0));
FV[x,i]:=0.5*(1+(SinH(-12.278243687/0.001)/CosH(-12.278243687/0.001)));
balik ke prmsalahan, gw ampe ribet trace ke unit2 laen, buka buku matematika , akhirnya nemu permasalahannya.
Code:
function SinH(X:extended):extended;
begin
result:=exp(x)-exp(-x);
end;
function CosH(x:extended):extended
begin
result:=exp(x)+exp(-x);
end;
Nah pas eksekusi kan -12.278243687/0.001 = -12278.243687, trus exp(-12278.243687) = 0, dan exp(12278.243687) = error... Trus gw hitung pake calc.exe exp(12278.243687), hasilnya = 12278243687,e+0 ato Infinite Number.. Ternyata komp ga mampu ngitung eksponensial sgede itu
Nah developer delphi tu mengasumsikan TanH(x)=SinH(x)/CosH(x) ajah. Pdahal ada aturannya lagi,
klo lebih besar dari 20, TanH me-return 1, klo lebih kecil dari -20, TanH me-return -1.
Jadi gw bikin custom function:
Code:
function MyTanH(X:extended):extended;
var
r1,r2 : extended ;
begin
if x > 20.0
then result := 1.0
else if x < -20.0
then result := -1.0
else
begin
r1 := exp(x) ;
r2 := exp(-x) ;
result:= (r1 - r2) / (r1 + r2) ;
end ;
end;
Eng-ing-eng..problem solved! Trnyata developer Delphi ga teliti!
Thx smuanya, n yg ngasih buku2 matematika!!!!  |
|
|
| |
|
|
|
 |
|
deLogic |
| Location: Jakarta |
|
Post subject:
Posted: 13/Mar/2009 10:57
|
|
onMage
Joined: 04-Jul-2005
Posts: 2282
Location: Jakarta
|
|
|
|
|
 |
|
|