Floating-point pression Platform abhängies EPSILON
-
@SoIntMan sagte in Floating-point pression Platform abhängies EPSILON:
Angenommen t = 45°, bx =100, by =100
Die Winkelfunktionen in C verlangen nach Winkel im Bogenmaß (Vollkreis ist ), hast Du so die Werte übergeben?
-
@SoIntMan Du kannst da auf das NaN reagieren.
https://de.wikipedia.org/wiki/NaN
Da das nur bei 45° +/- n*90° auftritt, kannst du dann den Sonderfall behandeln
-
@john-0 jepp habe ich
public double ConvertToRadians(double angle) { return (Math.PI / 180) * angle; }
-
-
@DirkB sagte in Floating-point pression Platform abhängies EPSILON:
@SoIntMan Du kannst da auf das NaN reagieren.
https://de.wikipedia.org/wiki/NaN
Da das nur bei 45° +/- n*90° auftritt, kannst du dann den Sonderfall behandelnvielen dank;) solangsam wirds;)
-
Da hier anscheinend nicht verstanden wird, warum Maschinenepsilon absolut gar nix mit Gleichheit zu tun hat eine Demo (ich spare mir mal eine saubere Templatisierung, die die Bitbreite der Fleißkommazahlen und Integers betrachtet und nehme an
sizeof(double) == sizeof(long)
):#include<iostream> #include<iomanip> #include<cfloat> using namespace std; void print_diff(double lhs, double rhs) { int diff = *(long*)&lhs - *(long*)&rhs; cout << setprecision(20) << lhs<< " ist um " << diff << " Fließkommawerte größer als " << rhs << ". Absolute Differenz ist " << lhs - rhs << '\n'; } int main() { cout << "Maschinenepsilon: " << DBL_EPSILON << '\n'; double literal_one = 1.0; double calculated_one = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1; print_diff(literal_one, calculated_one); double literal_large_value = 1e50; double calculated_large_value = calculated_one * 1e50; print_diff(literal_large_value, calculated_large_value); double literal_small_value = 1e-50; double calculated_small_value = calculated_one * 1e-50; print_diff(literal_small_value, calculated_small_value); }
Ausgabe auf den meisten Systemen:
Maschinenepsilon: 2.22045e-16 1 ist um 1 Fließkommawerte größer als 0.99999999999999988898. Absolute Differenz ist 1.1102230246251565404e-16 1.0000000000000000763e+50 ist um 1 Fließkommawerte größer als 9.9999999999999986861e+49. Absolute Differenz ist 2.0769187434139310514e+34 1.0000000000000000076e-50 ist um 1 Fließkommawerte größer als 9.9999999999999988892e-51. Absolute Differenz ist 1.1869459682199748434e-66
Wenn jemand erklären möchte, wieso die Zahl 2.22045e-16 irgendetwas damit zu tun haben sollte, dass zwei Werte, die sich um 1.1e-16; 2.1e34; oder 1.2e-66 unterscheiden, trotzdem praktisch gleich sind, dann nur zu! Ich war ja sogar so nett und habe beim ersten Beispiel den Wert 1.0 zum Vergleich genommen, der direkt in der Definition des Epsilon vorkommt, bin aber bloß nach unten abgewichen. Und schon ist die Differenz ein ganz anderer Wert als Epsilon!
-
@SeppJ sagte in Floating-point pression Platform abhängies EPSILON:
Wenn jemand erklären möchte, wieso die Zahl 2.22045e-16 irgendetwas damit zu tun haben sollte, dass zwei Werte, die sich um 1.1e-16; 2.1e34; oder 1.2e-66 unterscheiden, trotzdem praktisch gleich sind, dann nur zu!
Wenn du das Maschinenepsilon mit dem betragsmässig grösseren der beiden Summanden multiplizierst, bekommst du eine gute Abschätzung für den maximal möglichen Fehler.
-
@SeppJ danke dass du dir die Mühe gibt das an einem Beispiel zu erklären;)
-
@SeppJ sagte in Floating-point pression Platform abhängies EPSILON:
Wenn jemand erklären möchte, wieso die Zahl 2.22045e-16 irgendetwas damit zu tun haben sollte, dass zwei Werte, die sich um 1.1e-16; 2.1e34; oder 1.2e-66 unterscheiden, trotzdem praktisch gleich sind, dann nur zu!
Du hast ja auch vergessen den StandardScaler zu nutzen.
Oder alternativ den MinMaxScaler oder RobustScaler. Damit habe ich aber noch keine praktische Erfahrungen gesammelt.
-
Es gibt bereits eine gute Abhandlung der Problematik: What Every Computer Scientist Should
Know About Floating-Point Arithmetic.
-
@john-0 ok overkill, aber ich schau es mir mal an;=)