Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Theoretische Informatik (http://www.informatikerboard.de/board/board.php?boardid=5)
---- formale Sprachen (http://www.informatikerboard.de/board/board.php?boardid=12)
----- Typumwandlungen C++ (http://www.informatikerboard.de/board/thread.php?threadid=1454)


Geschrieben von Dragon_Fighter am 10.04.2013 um 22:33:

  Typumwandlungen C++

Meine Frage:
Formulieren Sie aus den folgenden Ausdrücken C++-Anweisungen:

[latex]w=(x-1)^2[/latex]

[latex]y=w+\frac{x-1}{x+1}[/latex]

[latex]f=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\frac{x^4}{4!}[/latex]


Berechnen Sie den Wert der Ausdrücke für [latex]x=1[/latex].

Meine Ideen:
Also ich habe das so gemacht (bestimmt sehr umständlich, aber ich möchte ja für f auch die Dezimalzahl haben):

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
#include <iostream>
using namespace std;

int x=1,w,y;
double f;

w=(x-1)*(x-1);

y=((x-1)/(x+1))+w;

f=1+(double)x+(((double)x*(double)x)/(double)2)+(((double)x*(double)x*(double)x)/((double)6))+(((double)x*(double)x*(double)x*(double)x)/((double)24));

cout << w << endl;
cout << y << endl;
cout << f << endl;


Nach dem Compilieren und der Ausführung ergibt sich

code:
1:
2:
3:
4:
5:
0
0
2.70833



Ist ja richtig, aber kann man das mit der expliziten Typumwandlung irgendwie praktischer/ kürzer machen?



Viele Grüße

Dragon_Fighter



Geschrieben von eulerscheZahl am 11.04.2013 um 08:06:

 

Ja, das geht kürzer:
code:
1:
f=1 + x + x*x/2.0 + x*x*x/6.0 + x*x*x*x/24.0;

1. int + double = double
es reicht also, wenn eine der beiden Zahlen double ist, ebenso bei /
2. Zahlen kann man einfach mit .0 am Ende umwandeln, also z.B. 2.0 (die 0 brauchst du nicht unbedingt, 2. geht genauso)



Geschrieben von Airblader am 11.04.2013 um 08:26:

 

Ich würde die Zahlen einfach vorher schon konvertieren. Für ganzzahlige x muss bereits y eine Fließkommazahl sein (dass y für x=1 ganzzahlig ist, ist "Glück") und eigentlich lese ich in der Aufgabenstellung auch nichts davon, dass die Eingabe x unbedingt ganzzahlig ist.

Zitat:
also z.B. 2.0 (die 0 brauchst du nicht unbedingt, 2. geht genauso)


Bitte nicht!



Geschrieben von Dragon_Fighter am 11.04.2013 um 11:49:

 

Hallo, Airblader.

Stimmt, eigentlich könnte man ja die Zahl x gleich vom Typ double auffassen.

Dann hätte ich dieses:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
#include <iostream>
using namespace std;

int main() {

double x=1,w,y,f;

w=(x-1)*(x-1);

y=((x-1)/(x+1))+w;

f=1+x+((x*x)/(double)2)+((x*x*x)/((double)6))+((x*x*x*x)/((double)24));

cout << w << endl;
cout << y << endl;
cout << f << endl;

}


Das sieht schon viel schöner aus - finde ich. Denn ich muss nur noch die Nenner in den Typ double umwandeln. Oder muss ich das gar nicht, weil es reicht, wenn der Zähler vom Typ double ist?

Ich habe das mal ausprobiert, also:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
#include <iostream>
using namespace std;

int main() {

double x=1,w,y,f;

w=(x-1)*(x-1);

y=((x-1)/(x+1))+w;

f=1+x+((x*x)/2)+((x*x*x)/(6))+((x*x*x*x)/(24));

cout << w << endl;
cout << y << endl;
cout << f << endl;

}


und tatsächlich, das liefert ebenfalls

code:
1:
2:
3:
0
0
2.70833
.


Also liege ich wohl richtig damit, dass es vollkommen ausreichend ist, dass der Zähler von diesem Typ ist.

Edit: Jetzt lese ich, dass eulerscheZahl das ja auch schon geschrieben hatte, sorry, total überlesen.

großes Grinsen


Forensoftware: Burning Board, entwickelt von WoltLab GmbH