OK, i have a script, which calculate Y=1/(C-A). C is input, A is intetrval [Ap;Ag] with step Az;
And i have one problem, when c=2, A[-1.5;2.5] with step 0.1, when i want to say that 0 isn't possible in 1/0, the program colculate me: Y = -2.1e+06 . Programm is not English language, sorry. Problem in answer line 36.
Code:
/*
Justas Maziliauskas
IF110054
1 kursas
Algoritmas galvotas - 1val.
Programos kūrimas - 5val.
Programos paskirtis apskaičiuoti funkcijos y=1/(c-a) reikšmes.
Vartotojas turės įvesti c reikšmę, o a reikšmė apskaičiuojama intervale, kurio
priekį, galą ir žingsnį įveda vartotojas.
*/
#include <iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;
int main ()
{
float y, c, ap, az, ag;
//-----------------------------------------
cout << setfill('-') << setw(58) << "-" << setfill(' ') <<endl;
cout <<"Justas Maziliauskas\n";
cout <<"IF110054\n";
cout <<"I kursas\n";
cout << setfill('-') << setw(58) << "-" << setfill(' ') <<endl;
cout <<"Algoritmas galvotas - 30min.\n";
cout <<"Programos kurimas - 3val.\n";
cout << setfill('-') << setw(58) << "-" << setfill(' ') <<endl;
//------------------------------------------
cout << "Iveskite kintamojo C reiksme.\n";
cin >> c; //įvedame C reikšmę
do {
cout << "Iveskite intervalo pradzia ir gala.\nPradzia ir galas sutapti negali!\n";
cin >> ap >> ag; //įvedame intervalo pradžią ir galą
} while (ap == ag); //išsireikalaujame, kad intervalo pradžia ir galas nesutaptų
do {
cout << "Iveskite intervalo kitimo zingsni, kuris nelygus 0.\n";
cin >> az; //įvedame intervalo kitimo žingsnį
} while (az == 0.0); //išsireikalaujame, kad intervalo kitimo ˛ingsnis būtų nelygus 0
if (ag > ap && az > 0.0) { //jei intervalas didėjantis IR žingsnis DIDESNIS už 0, skaičiuojame
cout << setfill('-') << setw(58) << "-" << endl;
cout << setfill(' ') << setw(8)<<"Sprendinio nr. " <<"| "<<"Atsakymas\n";
cout << setfill('-') << setw(58) << "-" << setfill(' ') <<endl;
for (float z = 1.0, a = ap; a <= ag; a += az) {
if (a == c) { //jei vardiklis lygus 0
cout << setfill(' ') << setw(14) << z << ". ";
cout << "Kai A = " << a <<", o " << c << " - " << a <<" = 0, apskaiciuoti\nnegalima, nes dalyba is 0 negalima.\n";
}
else {
y = 1.0 / (c - a); //skaičiuojame
cout << setfill(' ') << setw(14) << z << ". " << "Y = " << setprecision(3) << y << endl;
}
z++; //prisideame vienetuką prie sprendinio nr.
}
}
if (ag < ap && az < 0.0) { //jei intervalas mažėjantis IR žingsnis MAŽESNIS uz 0
cout << setfill('-') << setw(58) << "-" << endl;
cout << setfill(' ') << setw(8)<<"Sprendinio nr. " <<"| "<<"Atsakymas\n";
cout << setfill('-') << setw(58) << "-" << setfill(' ') <<endl;
for (float z = 1.0, a = ap; a >= ag; a += az) {
if (a == c) { //jei vardiklis lygus 0
cout << setfill(' ') << setw(14) << z << ". ";
cout << "Kai A = " << a <<", o " << c << " - " << a <<" = 0, apskaiciuoti\nnegalima, nes dalyba is 0 negalima.\n";
}
else {
y = 1.0 / (c - a); //skaičiuojame
cout << setfill(' ') << setw(14) << z << ". " << "Y = " << setprecision(3) << y << endl;
}
z++; //prisideame vienetuką prie sprendinio nr.
}
}
if (ag > ap && az < 0.0) { //jei intervalas didėjantis IR žingsnis MAŽESNIS uz 0
cout << setfill('-') << setw(58) << "-" << endl;
cout << "Apskaiciuoti negalime,\nnes intervalas didejantis,\no zingsnis mazejantis.\n";
}
if (ag < ap && az > 0.0) { //jei intervalas mažejantis IR žingsnis DIDESNIS už 0
cout << setfill('-') << setw(58) << "-" << endl;
cout << "Apskaiciuoti negalime,\nnes intervalas mazejantis,\no zingsnis didejantis.\n";
}
cout << setfill('-') << setw(58) << "-" << setfill(' ') <<endl;
system ("pause");
return 0;
}
Code:
----------------------------------------------------------
Justas Maziliauskas
IF110054
I kursas
----------------------------------------------------------
Algoritmas galvotas - 30min.
Programos kurimas - 3val.
----------------------------------------------------------
Iveskite kintamojo C reiksme.
2
Iveskite intervalo pradzia ir gala.
Pradzia ir galas sutapti negali!
-1.5
2.5
Iveskite intervalo kitimo zingsni, kuris nelygus 0.
0.1
----------------------------------------------------------
Sprendinio nr. | Atsakymas
----------------------------------------------------------
1. Y = 0.286
2. Y = 0.294
3. Y = 0.303
4. Y = 0.313
5. Y = 0.323
6. Y = 0.333
7. Y = 0.345
8. Y = 0.357
9. Y = 0.37
10. Y = 0.385
11. Y = 0.4
12. Y = 0.417
13. Y = 0.435
14. Y = 0.455
15. Y = 0.476
16. Y = 0.5
17. Y = 0.526
18. Y = 0.556
19. Y = 0.588
20. Y = 0.625
21. Y = 0.667
22. Y = 0.714
23. Y = 0.769
24. Y = 0.833
25. Y = 0.909
26. Y = 1
27. Y = 1.11
28. Y = 1.25
29. Y = 1.43
30. Y = 1.67
31. Y = 2
32. Y = 2.5
33. Y = 3.33
34. Y = 5
35. Y = 10
36. Y = -2.1e+06
37. Y = -10
38. Y = -5
39. Y = -3.33
40. Y = -2.5
41. Y = -2
----------------------------------------------------------
Last edited by justutiz; October 2nd, 2011 at 07:42 AM.
... so I dont find how I can do the folowing that a == c, then a and c is floats.
In general you cannot just compare floats as "a == c". You have to implement some relative small (with respect to the "a" and "c") value ("delta") and compare like:
trying everything, and still dont get how to fix it.
Code:
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <math.h>
using namespace std;
int main ()
{
float y, c, ap, ag;
c = 0;
ap = -1;
ag = 1;
float az = 0.1;
if (ag > ap && az > 0.0) {
for (float a = ap; a <= ag; a += az) {
if ( fabsf(c - a) < 0.0 && fabsf(c - a) > 0.0 ) {
cout << "1/0 not posible";
}
else {
y = 1.0 / (c - a);
cout << setprecision(4) << y <<" " << a << " " << c << endl;
}
}
}
else cout << "STOP";
system ("pause");
return 0;
}
Yes, it works, but maybe it is shortes way to compare c-a is 0?
Well, the big mistake you make is that you think math and programming are the same. Floats in programming have finite precision, so you must take certain precautions and tricks to succeed with your calculations. Like comparing with 0.00001, for example.
Bookmarks