2016-05-26 14 views
1

Ich fragte diese Frage vor jetzt, als ich diese Frage zum ersten Mal fragte, wusste ich nicht, was das Problem war, aber ich weiß und ich habe versucht zu lesen Ist Gleitkomma-Mathematik gebrochen? und warum sind Fließkommazahlen ungenau? Sie zeigten den Grund für die Probleme, aber ich sah sowieso nicht, wie ich dieses Problem im Code, den ich geschrieben habe, umgehen konnte. Jetzt frage ich, ob irgendjemand weiß, was ich mit dem Code machen soll, damit das Programm funktioniert. Der Code und die Beschreibung unterSchreiben Sie ein Programm, das die Werte für zwei Variablen auf einen bestimmten Wert bestimmt

Die Idee hinter diesem Programm ist es, den Wert von zwei Doppel a und t zu finden, wo, wenn sie multipliziert wurden, geben sie einen bestimmten Wert. Also, wenn der angegebene Wert 4 war das Programm die Werte von a und t zu finden, wo, wenn sie multipliziert wurden sie in einem Bereich von 5 bis 10. 4. Die Variable t ist

Ich schrieb den folgenden Code geben würde, in diesem

int main(void) 
{ 
    double a = 0.01; 
    double t = 5; 
    while(1){ 
     if(t * a != 4){ 
      t = t + 0.01; 
      if(t > 10){ 
       t = 5; 
       a = a + 0.01; 
      } 
     } 
     else if (t * a == 4){ 
      break; 
     } 
    } 
    printf("%f %f", t, a); 
    return 0; 
} 

der Code scheint nicht, wenn ich i 0,01 unter Verwendung der Werte zu erhöhen, versuchen zu arbeiten, obwohl es, wenn der Wert des Zuwachses arbeitet 1. ist weiß, dass ich den Grund, warum dies geschieht, aber wie würde ich dieses Problem beheben Programmcode oder gibt es andere Möglichkeiten, wie ich den Code schreiben könnte ?. Der Code scheint nur Schleife für immer

+4

Beachten Sie, dass * "Der Code scheint nicht zu funktionieren" * ist nie ausreichend Problembeschreibung. Was ist passiert? Was hast du erwartet? – user694733

+2

Was funktioniert nicht? Können Sie sagen, was Sie erwarten und was Sie bekommen? –

+0

't * a' könnte mich nie _exactly_ 4. Wenn Sie den Artikel" Ist Gleitkomma-Mathe gebrochen "gelesen haben, sollten Sie das wissen. –

Antwort

3

Anstelle der Verwendung von Gleichheit zwischen zwei Doppelzimmern einen kleinen Bereich nutzen zu drucken.

#include <math.h> 
#include <stdio.h> 

int main(void) 
{ 
    double a = 0.01; 
    double t = 5.0; 
    double epsilon = 0.000001; 
    while(1){ 
     if(fabs(t * a - 4.0) < epsilon){ 
      break; 
     } 
     else{ 
      t = t + 0.01; 
      if(t > 10){ 
       t = 5; 
       a = a + 0.01; 
      } 
     } 
    } 
    printf("%f %f %f", t, a, a*t); 
    return 0; 
} 

Beachten Sie, dass fabs(x - y) < epsilon-(y - epsilon) < x && x < (y + epsilon) äquivalent ist, so dass Sie überprüfen, ob x um y in einem sehr kleinen Intervall fällt.

-1

wenn a * t 4 dann a4/t sein wird. Wenn nun t im Bereich von 5 bis 10 ist und die Werte 5.1, 5.2 usw. annehmen kann, dann hat a einen entsprechenden Wert für jeden Wert von t.

d.h. für t = 5,1 a = 0,78431

für t = 5,2 a = 0,7692.

können Sie eine Schleife ausführen, um die Werte von a für jeden Wert von t

t = 5.0; 
for (i=0; i<50; i++) 
{ 
    t += 0.1; 
    a = 4/t; 
    printf ("%f %f",a,t); 
} 
+0

Während dieser Antwort löst dieses spezifische Problem, das ist ähnlich, OP einen Fisch zu geben, anstatt ihnen beizubringen, wie man es fängt. Die Frage ist wirklich, wie FP-Gleichheit im Allgemeinen zu bestimmen ist, nicht über das Lösen von 'a * t == 4' gegeben '5 <= t && t <10 && 0

Verwandte Themen