AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FMod "streikt"

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

Registriert seit: 15. Mär 2007
4.075 Beiträge
 
Delphi 12 Athens
 
#11

AW: FMod "streikt"

  Alt 26. Jun 2017, 20:06
Ich hätte dazu auch noch ne Frage:
Wie bekommt man denn eine 150-stellige Zahl überhaupt hin ?
Extended sollte doch sofort auf 18-20 Stellen kürzen, oder bleibt 1.2E150 etwa so bestehen ?

Delphi-Quellcode:
    LExt := 1.2E-150;
    LExt := LExt + 0.1E-150; // Das geht tatsächlich
    LExt := Sin(LExt); // Das aber wohl nicht

    LExt := 1.2E-150;
    LExt := LExt + 0.1E-149; // Das geht tatsächlich

    LExt := 1.2E150;
    LExt := LExt + 0.1E150; // Das geht tatsächlich
    LExt := Sin(LExt); // Das wohl auch nicht
Ich benutze solche Extremen normalweise nicht, bin aber auch etwas schockiert das es nur "teilweise" funktioniert.
Anscheinend kann man mit Mantisse/Exponent rechnen, aber mit keine Funktion.
Da hoffe ich mal das ich sowas nie brauchen werde.

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: FMod "streikt"

  Alt 26. Jun 2017, 21:55
Ich hätte dazu auch noch ne Frage:
Wie bekommt man denn eine 150-stellige Zahl überhaupt hin ?
Extended sollte doch sofort auf 18-20 Stellen kürzen, oder bleibt 1.2E150 etwa so bestehen ?
Siehe Post #2.

Das Stichwort heißt "signifikante Dezimalstellen"

Eine Fließkommazahl besteht aus dem Vorzeichen (+ oder -), der Mantisse und dem Exponent.
Die Mantisse ist der Teil, in welchem die 18-20 "signifikanten" Dezimalstellen stecken und mit dem Exponent kann man ihn hin und her schieben, also bei Extended um fast 5000 Dezimalstellen vor oder hinter das Komma. (bei Double etwa 300 Dezimalstellen)

3,4xxxxxxxxxxxxxxxxx * 10^-4932 bis 1,1xxxxxxxxxxxxxxxxxx * 10^4932
3,4xxxxxxxxxxxxxxxxx / 10^4932 bis 1,1xxxxxxxxxxxxxxxxxx * 10^4932
das im Positiven und nochmal im degativen Bereich, zuzüglich der 0 und den Sonterwerten NAN, Infinity und NegInfinity.

https://www.h-schmidt.net/FloatConverter/IEEE754de.html
https://de.wikipedia.org/wiki/Mantisse
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (26. Jun 2017 um 22:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#13

AW: FMod "streikt"

  Alt 27. Jun 2017, 08:59
Zur Frage wie man 150 Stellen überhaupt hinbekommt: Man muss sich mit eigenen Typen behelfen. Hier mal ein Beispiel:
http://www.delphiforfun.org/Programs...g_integers.htm

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
gammatester

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

AW: FMod "streikt"

  Alt 27. Jun 2017, 10:04
Ich hätte dazu auch noch ne Frage:
Wie bekommt man denn eine 150-stellige Zahl überhaupt hin ?
Extended sollte doch sofort auf 18-20 Stellen kürzen, oder bleibt 1.2E150 etwa so bestehen ?

Delphi-Quellcode:
    LExt := 1.2E150;
    LExt := LExt + 0.1E150; // Das geht tatsächlich
    LExt := Sin(LExt); // Das wohl auch nicht
Ich benutze solche Extremen normalweise nicht, bin aber auch etwas schockiert das es nur "teilweise" funktioniert.
Ich glaube Du solltest Dir erst einmal klar werden, was Du unter "Stellen" verstehst. Bei Ganzzahl-Werten sind die "Stellen" tatsächlich so etwas wie die Anzahl der einzelnen (Dezimal-)Ziffern.

Bei Fließkomma-Zahlen (double) hat man sowas wie m*10^e, wobei im wesentlichen m eine Ganzzahl zwischen 0 und ca 10^16 ist. Hier hat ein double also ca 16 (signifikante "Stellen").

Bei Fließkomma-Rechnungen wird immer auf diese 16 Stellen gerundet und das hat manchmal komische Konsequenzen, zB wird 2E16 + 1 = 20000000000000000 + 1 = 20000000000000001 zu 20000000000000000 gerundet, d.h. Du kannst beliebig oft 1 zu 2E16 addieren ohne das sich der Double-Wert ändert.

Daß sin(1e150) nicht funktioniert, ist ein Delphi-Bug (EMBA wird sagen 'Feature').
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.075 Beiträge
 
Delphi 12 Athens
 
#15

AW: FMod "streikt"

  Alt 27. Jun 2017, 17:08
Ja ich bin von signifikanten Stellen ausgegangen. Das sin (e150) nicht funktioniert finde ich schon erschreckend. Ich hatte mit dem erstbesten online js Rechner getestet und der konnte etwas sinnvolles zurückgeben.

Das heisst für mich erstmal Achtung bei fliesskomma Rechnungen.
Mit Rundungsfehlern hätte ich gerechnet aber solche logikfehler eher nicht.
  Mit Zitat antworten Zitat
Johann Steiner

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

AW: FMod "streikt"

  Alt 1. Jul 2017, 01:03
Hallo Leute,
die Ursache für die Entstehung des Problems war das März-Preisrätsel 2017 in Bild der Wissenschaft.
Dabei hat mich nicht die "Lösung des Problems" interessiert, sondern wie das Endergebnis ausschaut und ob bei jeder diversen Losziehung das gleiche Ergebnis herauskommt.
Die Berechnung war kein Problem, Double genügt, aber das gesamte Ergebnis als String darzustellen war mir unmöglich.
Als FMode bei e^21 ausstieg war ich schon sehr erstaunt (nicht einmal Single wird überschritten!), zumal in der Hilfe doch die Funktion mit Extended-Werten umgehen sollte können.
So wollte ich das machen:
function ExtToString(source:Extended): string;
const
CharDigits = '0123456789';
var Rest:integer;
begin
Result := '';
repeat
Rest:= Round(FMod(Source, 10))+1;
Result := CharDigits[Rest] + Result;
ASource := Int(Source / 10);
until (Source = 0);
end;
Nach euren Hinweisen habe ich die Unit UBigIntsV5 von Gary Darby verwendet und es klappt hervorragend.

Nochmals herzlichen Dank an alle!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

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 06:30 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