AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

FMod "streikt"

Ein Thema von Johann Steiner · begonnen am 25. Jun 2017 · letzter Beitrag vom 1. Jul 2017
Antwort Antwort
Seite 1 von 2  1 2   
Johann Steiner

Registriert seit: 11. Jun 2005
10 Beiträge
 
#1

FMod "streikt"

  Alt 25. Jun 2017, 14:00
Delphi-Version: 10 Berlin
Liebe Delphianer,


ich möchte mit der Funktion FMod (System.Math) eine ca 150-stellige Zahl zerlegen.
Leider steigt die Funktion bei Zahlenwerten um ca x^20 aus mit der Meldung "Ungültige Gleitkommaoperation".
Laut Hilfe sollte die Funktion Extended-Bereiche beherrschen!

Was kann ich machen, was mache ich falsch?

PS: Delphi-Version: DX 10.2 Starter Edition
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#2

AW: FMod "streikt"

  Alt 25. Jun 2017, 14:51
Extended war nie für den produktiven Einsatz gedacht, sondern nur zur FPU-internen Verwendung.
Ab Windows 64 Bit gibt es diesen Typ auch nicht mehr "nativ" im Delphi.

Und Extended hat auch nur 19-20 "signifikante" Dezimalstellen ... mehr ist einfach nicht möglich und alles außerhalb dieser Stellen ist "undefiniert".

12345678901234567890xxxxxxxxxxxxxxxxxx,xxxxxxxx
123456789012,34567890xxxxxxxxxxxxxxxxxxxxxxxxxx
0,00000000000012345678901234567890xxxxxxxxxxx


Einzige Lösung
* String
* BCD
* BigInt und Co.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Jun 2017 um 14:59 Uhr)
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#3

AW: FMod "streikt"

  Alt 25. Jun 2017, 15:24
fmod crasht auch bei double. Ich vermute, daß EMBA intern floor oder trunc verwendet, und die crashen halt wenn der Integerbereich übertreten wird (habe auch Starter ohne Quellcode).

Mit int hat man solche Probleme nicht (ob solche Rechnungen sinnvoll sind, ist eine andere Frage)
Delphi-Quellcode:
var
  x,y,z: double;
begin
  try
  x := 1.23e150;
  y := 2e20;
  z := int(x/y);
  z := x-z*y;
  writeln(z);
  z := fmod(x,y);
  writeln(z);
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Geändert von gammatester (25. Jun 2017 um 15:27 Uhr)
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#4

AW: FMod "streikt"

  Alt 25. Jun 2017, 15:35
150 Stellen... das über Fließkomma zu machen ist der falsche Weg, selbst wenn es ginge.

da gibt es Leute die haben genau dafür was passendes gemacht, und bieten es ganz unten auf der Seite sogar recht aktuell zum Download an
http://www.delphiforfun.org/Programs...g_integers.htm
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#5

AW: FMod "streikt"

  Alt 25. Jun 2017, 15:46
Zitat:
Delphi-Quellcode:
function FMod(const ANumerator, ADenominator: Extended): Extended;
begin
  Result := ANumerator - Trunc(ANumerator / ADenominator) * ADenominator;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

AW: FMod "streikt"

  Alt 25. Jun 2017, 15:50
150 Stellen... das über Fließkomma zu machen ist der falsche Weg, selbst wenn es ginge.
Das ist ja nicht das Problem. fmod hat nicht zu crashen, das ist mit Vorbehalt ein Delphi-Bug, da EMBA zumindest in der Hilfe keine Beschränkung erwähnt (ein Crash wäre OK, wenn der Quotient einen Overflow ergäbe).

Wenn man große Integer-Zahlen bearbeitet will, kann man mein http://www.wolfgang-ehrhardt.de/misc_de.html#mparith benutzen.

Edit: Dank an himitsu, der meine Vermutung bestätigt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#7

AW: FMod "streikt"

  Alt 25. Jun 2017, 16:59
ob solche Rechnungen sinnvoll sind, ist eine andere Frage
Ich kann dir die Lösung sogar aus dem Kopf nennen, wenn ich alle "ungültigen" Dezimalstellen wegrunde.
1.23e150 fmod 2e20 = 0
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Johann Steiner

Registriert seit: 11. Jun 2005
10 Beiträge
 
#8

AW: FMod "streikt"

  Alt 25. Jun 2017, 23:11
Herzlichen Dank an alle!
Habt mir sehr geholfen.
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
577 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: FMod "streikt"

  Alt 26. Jun 2017, 07:33
Nebenfrage:

Wozu benötigt man eine 150 stellige Zahl?

Ciao
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.330 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: FMod "streikt"

  Alt 26. Jun 2017, 07:38
Wozu benötigt man eine 150 stellige Zahl?
Zum Beispiel bei der Primzahlberechnung
Gibt sicher noch mehr Beispiele. Was in diesem Thread der Grund ist, weiß ich allerdings auch nicht.
Peter
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz