Darstellung und Vergleich von Dezimalzahlen

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Darstellung und Vergleich von Dezimalzahlen

Beitrag von schubbiaschwilli »

Gude!

Ach, ich komme mal wieder nicht so richtig weiter... Hat sich schon mal jemand mit der Darstellung von Zahlen mit R beschäftigt bzw. hatte damit so seine lieben Probleme? Ich hänge hier:

Code: Alles auswählen

gamma<-seq(0.05, 0.1, 0.01)
gamma==0.07
gamma==0.06
Der Vergleich mit 0.06 funktioniert nicht, und ich habe keine Idee, wie sich das einigermaßen elegant lösen lässt.

Dank&Gruß
Schubbiaschwilli

Nachtrag: Es geht um die Darstellung von Zahlen im Rechner, nicht um die Bildschirmausgabe.

Code: Alles auswählen

options(digits=22)
seq(0.05, 0.1, 0.01)
0.06
bigben
Beiträge: 2770
Registriert: Mi Okt 12, 2016 9:09 am

Re: Darstellung und Vergleich von Dezimalzahlen

Beitrag von bigben »

Hi schubbiaschwilli,

das ist ein allgemeines Informatikproblem. Man darf Fließkommazahlen niemals mit == vergleichen. Auf der allerletzten Binärstelle kann es da Unterschiede geben, die Dir nie angezeigt werden.
Google ist voll von Warnungen, aber es ist einfach zu verführerisch.
Schau beispielsweise mal hier: https://floating-point-gui.de/errors/comparison/

Oder hier mal ganz polyglott um zu zeigen, dass das nichts spezielles für R ist:
https://www.geeksforgeeks.org/problem-i ... correctly/

LG,
Bernhard

PS: Ich weiß nicht, ob Du es schon wusstest, aber man kann sich in R auch infix-Funktionen wie die folgende "almost equal" Funktion selbst schreiben:

Code: Alles auswählen

# almost equal function %aeq%
`%aeq%` <- function(a, b){
  margin <- 1e-6
  abs(a-b) < margin
}

a <-  3*.0001
b <- .0003

a == b
#> [1] FALSE
a %aeq% b
#> [1] TRUE

gamma<-seq(0.05, 0.1, 0.01)
gamma==0.07
#> [1] FALSE FALSE  TRUE FALSE FALSE FALSE
gamma==0.06
#> [1] FALSE FALSE FALSE FALSE FALSE FALSE

gamma %aeq% 0.07
#> [1] FALSE FALSE  TRUE FALSE FALSE FALSE
gamma %aeq% 0.06
#> [1] FALSE  TRUE FALSE FALSE FALSE FALSE
Du musst Dir halt einen geeigneten Wert für margin überlegen.
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: Darstellung und Vergleich von Dezimalzahlen

Beitrag von schubbiaschwilli »

Gude!

Mir ist schon klar, was da passiert - Ich hatte sogar mal was zu vorzeichenbehafteten Nullen in Access in meinem Blog geschrieben
https://thepathisthegoalblog.wordpress. ... ned-zeros/
weil mir da was auf die Füße gefallen ist, und ich kenne das mit abs(x-y) < eps - Aber eine elegante Lösung gibt es nicht? Ich will das als (eine Zeile) Beispielcode in meinem Blog veröffentlichen, und da möchte ich nicht sowas

Code: Alles auswählen

abs(seq(0.05, 0.1, 0.01) - 0.06) < 10^-9
schreiben...

Dank&Gruß
Schubbiaschwilli
Athomas
Beiträge: 767
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Darstellung und Vergleich von Dezimalzahlen

Beitrag von Athomas »

Hier gibt's einen kleinen Überblick über die Unbilden von Gleitkommazahlen: https://de.wikipedia.org/wiki/Gleitkommazahl
bigben
Beiträge: 2770
Registriert: Mi Okt 12, 2016 9:09 am

Re: Darstellung und Vergleich von Dezimalzahlen

Beitrag von bigben »

Hi!
schubbiaschwilli hat geschrieben: Di Feb 06, 2024 5:39 pmMir ist schon klar, was da passiert
Ok, das war jetzt für mich nicht so unmittelbar ersichtlich.
Ich will das als (eine Zeile) Beispielcode in meinem Blog veröffentlichen, und da möchte ich nicht sowas
Naja, entweder Du machst es mit Integern vor statt mit Fließkommazahlen ( seq(1L, 6L) == 3L ) oder Du verwendest eine infix Funktion wie ich es in meinem PS gemacht habe. Dann wird es zwar ein Ein- zum Zweizeiler, aber dafür werden Deine Leser im- oder explizit vor einem typischen Fehler gewarnt.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: Darstellung und Vergleich von Dezimalzahlen

Beitrag von schubbiaschwilli »

Gude!
bigben hat geschrieben: Di Feb 06, 2024 8:43 pmOk, das war jetzt für mich nicht so unmittelbar ersichtlich.
Ja, das Thema ist nicht so einfach. Ich hatte das, was ich da in Access gefunden und in meinem Blog kurz beschrieben habe, zuerst im Microsoft-Forum gepostet - Und ich bekam erst mal ein paar Antworten, das läge an der Funktion zum Runden, und ich würde die nicht verstehen... Und ich hab' mir mal die Mühe gemacht, und das per Chat an einen Support-Mitarbeiter von MS gemeldet - Ich bin mir sicher, er hat es nicht verstanden - Müßig zu erwähnen, dass er erst mal auf die Idee kam, ich würde die Funktion zum Runden...

Aber es gibt da auch kein Paket oder so zu? Ich hab' auch nichts gefunden, aber ich bin ja sicher nicht der erste, der das Problem hat - Dachte ich jetzt.

Dank&Gruß
Schubbiaschwilli
Antworten