# 0 isn't 0 in C++ math

Show 50 post(s) from this thread on one page
Page 1 of 2 12 Last
• October 2nd, 2011, 05:08 AM
justutiz
0 isn't 0 in C++ math
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:

```/*  */ #include <iostream> #include <cstdlib> #include <iomanip> using namespace std; int main () {     float y, c, ap, az, ag;         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:

``` 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 ----------------------------------------------------------```
• October 2nd, 2011, 05:19 AM
VictorN
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by justutiz
OK, i have a script, which calculate ...

Scripts are not discussed in this Forum.
There is a Visual C++ Programming forum, and Visual C++ is code, not script.

Quote:

Originally Posted by justutiz
... which calculate Y=1/(C-A). C is input, A is intetrval [Ap;Ag] with step Az;

Did you, perhaps, mean "A is a value within intetrval [Ap;Ag]"?

Anyway, have a look at:
Floating point
What Every Computer Scientist Should Know About Floating-Point Arithmetic
and a lot of other articles/discussions here
• October 2nd, 2011, 06:00 AM
justutiz
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by VictorN
Scripts are not discussed in this Forum.
There is a Visual C++ Programming forum, and Visual C++ is code, not script.

Did you, perhaps, mean "A is a value within intetrval [Ap;Ag]"?

Anyway, have a look at:
Floating point
What Every Computer Scientist Should Know About Floating-Point Arithmetic
and a lot of other articles/discussions here

Im reading, and Im very new in C++, so I dont find how I can do the folowing that a == c, then a and c is floats.
• October 2nd, 2011, 06:15 AM
VictorN
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by justutiz
... 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:
Code:

```if(abs(a - c) < delta) {   ... }```
• October 2nd, 2011, 07:42 AM
justutiz
Re: 0 isn't 0 in C++ math
but abs want me to use int, my a and c is floats
• October 2nd, 2011, 07:49 AM
VictorN
Re: 0 isn't 0 in C++ math
Well, I meant this abs, _abs64

However, you can use fabs instead.
• October 2nd, 2011, 08:07 AM
Igor Vartanov
Re: 0 isn't 0 in C++ math
Quote:

when i want to say that 0 isn't possible in 1/0, the program colculate me: Y = -2.1e+06
Result of 1/0 is infinity, while programming languages operate with only finite figures. So you have the best result FPU was able to provide. :)
• October 2nd, 2011, 08:10 AM
justutiz
Re: 0 isn't 0 in C++ math
Im still geting
Code:

```1      -1      0 1.11      -0.9      0 1.25      -0.8      0 1.43      -0.7      0 1.67      -0.6      0 2      -0.5      0 2.5      -0.4      0 3.33      -0.3      0 5      -0.2      0 10      -0.1      0 -1.34e+07      7.45e-08      0 -10      0.1      0 -5      0.2      0 -3.33      0.3      0 -2.5      0.4      0 -2      0.5      0 -1.67      0.6      0 -1.43      0.7      0 -1.25      0.8      0 -1.11      0.9      0```
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; }```
• October 2nd, 2011, 08:13 AM
Igor Vartanov
Re: 0 isn't 0 in C++ math
It's impossible to succeed with the condition fabsf(c - a) < 0.0. Victor meant something like fabsf(c - a) < 0.00001.
• October 2nd, 2011, 08:14 AM
justutiz
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by Igor Vartanov
Result of 1/0 is infinity, while programming languages operate with only finite figures. So you have the best result FPU was able to provide. :)

Yes, but why in my code -0.1 + 0.1 is not 0?
• October 2nd, 2011, 08:16 AM
justutiz
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by Igor Vartanov
It's impossible to succeed with the condition fabsf(c - a) < 0.0. Victor meant something like fabsf(c - a) < 0.00001.

Yes, it works, but maybe it is shortes way to compare c-a is 0?
• October 2nd, 2011, 08:25 AM
Igor Vartanov
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by justutiz
Yes, but why in my code -0.1 + 0.1 is not 0?

I don't know what's wrong with your code, but mine works fine:
Code:

```#include <stdio.h> int main() {     float a = -0.1;     printf("%f", a +0.1);     return 0; }```
Quote:

D:\Temp\8>8.exe

-0.000000

• October 2nd, 2011, 08:32 AM
justutiz
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by Igor Vartanov
I don't know what's wrong with your code, but mine works fine:
Code:

```#include <stdio.h> int main() {     float a = -0.1;     printf("%f", a +0.1);     return 0; }```

when add one time its true, but when you do it with cycle it looks something like this

a = -0.1 + 0.01000000001 and so on
and then you compare 0 with a it is looks something like this 0 != 0.0000000000001
• October 2nd, 2011, 08:32 AM
Igor Vartanov
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by justutiz
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.
• October 2nd, 2011, 08:34 AM
Igor Vartanov
Re: 0 isn't 0 in C++ math
Quote:

Originally Posted by justutiz
when add one time its true, but when you do it with cycle it looks something like this

a = -0.1 + 0.01000000001 and so on
and then you compare 0 with a it is looks something like this 0 != 0.0000000000001

Yep, see above: float calculations have finite precision. And the result might fluctuate a little. :)
Show 50 post(s) from this thread on one page
Page 1 of 2 12 Last