IF INT(x) = y ... -> .F. ? [erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12908
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

IF INT(x) = y ... -> .F. ? [erledigt]

Beitrag von AUGE_OHR »

hi,

ich hatte doch die Berechnung für den ZZP. http://www.xbaseforum.de/viewtopic.php?f=7&t=7920

Die zweiten Formel war nun eine Gegenprobe zur ersten Formel.
ich habe also die Werte per Parameter übergeben und komme auch auf das gewünschte Ergebnis.

Nun kann ein COS() ja von -1 bis +1 gehen und bei einem Kreis wäre bei 180° der "Wendepunkt" (?)
Ich wollte das nun abfangen mit der Zeile

Code: Alles auswählen

IF INT(n) = 180
aber da bekomme ich nur .F. ???

Code: Alles auswählen

PROC Do_More(XX,RR,LL,aa,oPS)
LOCAL x
LOCAL y
LOCAL z
LOCAL n

   y := RR**2
   y += (LL + RR - XX)**2
   y -= LL**2

   z := 2*RR
   z *= (RR + LL - XX)

   x := (y/z)     // von +1 bis -1
   GraSetColor( oPS, GraMakeRGBColor({1,aa,aa}) )
   GraMarker( oPS, {aa, (x*100)+100 } )

   n := RtoD( Acos(x) )  // Radiant in Grad

   IF INT(n) = 180   // müsste doch gehen !!!
*  IF aa = 180       // Zähler wurde als Parameter übergeben -> OK
*  IF n > 179.6      // hm ... das würde gehen
      n180 := .T.
   ENDIF

   IF n180 = .T.
      x := 360 - n
   ELSE
      x := n
   ENDIF

   GraSetColor( oPS, GraMakeRGBColor({aa,aa,1}) )
   GraMarker( oPS, {aa, (x) } )

RETURN
Zuletzt geändert von AUGE_OHR am Mo, 02. Jun 2014 14:21, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: IF INT(x) = y ... -> .F. ?

Beitrag von brandelh »

das dürfte das übliche Problem sein, 180° in DOUBLE Fließkommazahl ist halt selten exact 180° ...
Lösung, vergleichen mit Round() oder String oder > 179.9999 and < 180.0001 oder so !
Gruß
Hubert
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: IF INT(x) = y ... -> .F. ?

Beitrag von Herbert »

Nein, Hubert hier ist dies nicht der Fall. Obwohl nicht alle Variablentypen klar sind.

Int() ist das Problem. Int schneidet simpel die Nachkommastellen weg.
179.899 ergibt also 179 und nicht 180. Du musst also tatsächlich auf einen Grenzwert prüfen.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9362
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: IF INT(x) = y ... -> .F. ?

Beitrag von Tom »

@Herbert: Richtig. Oder runden und Int() verwenden.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12908
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: IF INT(x) = y ... -> .F. ?

Beitrag von AUGE_OHR »

hi,

Ja ... ich habe bei INT() einen Denkfehler gemacht.

Code: Alles auswählen

IF ROUND(n,0) = 180
wäre die richtige Lösung.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: IF INT(x) = y ... -> .F. ? [erledigt]

Beitrag von brandelh »

Du musst halt wissen, ob 179,500° bis 180,499° für deine Zwecke genau genug ist um es als 180° anzusehen, immerhin ist das 1° :!:
Ein Maschienenbauer wird sich die Hände über dem Kopf zusammenschlagen, ein Maurer sagt wunderbar genau :badgrin:
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12908
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: IF INT(x) = y ... -> .F. ? [erledigt]

Beitrag von AUGE_OHR »

hi,

ich übergebe ja das Ergebnis in die 2th. Formel und habe in der 1st. Formel INT von 1° - 360° vorgegeben.
es wäre also ähnlich wie

Code: Alles auswählen

ROUND((10/3)*3, 0) = 10
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: IF INT(x) = y ... -> .F. ? [erledigt]

Beitrag von brandelh »

Hallo Jimmy,

ich hatte im Hinterkopf, dass es um das geht ...
Jimmy hat geschrieben:für die Einstellung des ZZP ( Zünd-Zeit-Punkt) wird der Wert in ° ( Grad ) vor OT angegeben.
nun zeigt mein Totpunktfinder in 1/10 mm an und ich müsste es nach dieser Formel umrechnen
und wollte nur sagen, dass du beachten musst ob die Genauigkeit ausreicht.

Ich gebe zu nicht alle Code-Beispiele durchexerziert zu haben, wenn du nur eine COS() Linie am Monitor darstellen willst, reichen 1° Schritte genauso wie bei meinen gedrehten Schriften ;-)
Ich war mir nur nicht sicher ob dein Programm Berechnungen für ... erstellen soll und für das Motormanagement wären 1° Schritte wohl zu ungenau.

Daher mein Einwand, dass du wissen (oder prüfen) musst, ob die Genauigkeit reicht.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12908
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: IF INT(x) = y ... -> .F. ? [erledigt]

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Ich war mir nur nicht sicher ob dein Programm Berechnungen für ... erstellen soll und für das Motormanagement wären 1° Schritte wohl zu ungenau.
dazu muss ich sagen das es sich um ein altes Motorrad mit Kontakt-Zündung handelt wo man eh nur +- 1° genau einstellen kann.

Das ganz sollte zur Kontrolle dienen, weil beim Umbau der Anlasser-Kranz mit den Zündmarkierungen falsch eingebaut wurde.
Ich habe also den OT per "Ess-Stäbchen" Methode eingestellt und die statische Vorzündung "pi-mal-Daumen" 1 1/2 Zähne (7°)vor OT eingestellt.
OT_7_10.jpg
OT_7_10.jpg (95.33 KiB) 3910 mal betrachtet
während ich in der Nähe des OT nicht vernünftig messen kann kann ich 0.3mm - 0.6mm (7°-10°) durchaus bestimmen.
gruss by OHR
Jimmy
Antworten