Diskuze: celá čísla ve float

C++ C a C++ celá čísla ve float

Avatar
ondra.482
Člen
Avatar
ondra.482:

if (D<0)
{

x1=-(b/(2*a));
x2= sqrt(-D)/(2*a);

cout << "Rovnice nema zadny realny koren\n";
cout << "Rovnice ma dva imaginarni koreny\n";
cout << "x1= " << x1 << "+" << x2 <<"i";
//x2=((-b)-sqrt(D))/(2*a);
cout << "\nx2= " << x1 <<"-"<< x2 << "i\n";

}
Zdravím. Mám problém co týče diskriminantu. Když je D<0 hodí mě to na tuto podmínku,jenže ze vzorce x1=-(b/(2*a)); mi to vypíše jen celou cifru a další desetinné čísla mi to nevypisuje,ikdyž mám datový typ float.

 
Odpovědět 12.4.2013 21:20
Avatar
Odpovídá na ondra.482
Luboš Běhounek (Satik):

Používej tag code a vlep to sem znovu, tohle se moc číst nedá :)
EDIT: a vlep sem i jakých typů jsou proměnné.

Editováno 12.4.2013 21:26
Nahoru Odpovědět 12.4.2013 21:25
:)
Avatar
Odpovídá na ondra.482
Luboš Běhounek (Satik):

Problém bude asi ten, že
2 * a
se ti vždy spočítá celočíselně, protože násobíš celý číslo (2) a desetinný (proměnná a), což přímo nejde, takže se provede konverze a a se převede na celé číslo, protože první operand je celočíselný.

Nahraď tu dvojku tímto: 2.0f a pak už by to mělo běžet.

Editováno 12.4.2013 21:31
Nahoru Odpovědět 12.4.2013 21:31
:)
Avatar
ondra.482
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
ondra.482:

Krása :)) funguje jenom bych se ještě zeptal co to 2.0f vlastně je

 
Nahoru Odpovědět 13.4.2013 10:25
Avatar
Odpovídá na ondra.482
Luboš Běhounek (Satik):

Když zadáváš někde v kódu číslo přímo, tak kompilátor pozná podle nějakých vlastností, jakého typu to číslo je, většinou je to nějaký prefix nebo suffix (předpona / přípona).

Ukážu jich pár na dvojce:
2 je obyčejný int
2L je long
2.0 je double
2.0f je float
0x2 je (obvykle int) číslo zadané v hexa

Nahoru Odpovědět 13.4.2013 10:36
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na ondra.482
Kit:

Je to zápis čísla 2 v pohyblivé řádové čárce. Datový typ float.

Pokud bys měl a, b, c ve float, tak bys tohle neřešil.

Nahoru Odpovědět 13.4.2013 10:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
ondra.482
Člen
Avatar
ondra.482:

Už jsem si na to přišel,ale díky moc :))

 
Nahoru Odpovědět 13.4.2013 10:40
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Tohle by ta dvojka způsobila i kdyby a,b,c floatové měl.

Nahoru Odpovědět 13.4.2013 10:41
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

Nějak jsem zapomněl, že C neumí pořádně implicitní konverze.

Nahoru Odpovědět 13.4.2013 10:44
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
ondra.482
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
ondra.482:

Právě že né...a,b,c jsem měl v int a Diskrinant a kořeny ve float protože jsem měl za to,že až samotný kořen by se měl vypsat v desetinné formě. a když jsem oboje hodil do float tak to šlape i s tou dvojkou :)

 
Nahoru Odpovědět 13.4.2013 10:45
Avatar
ondra.482
Člen
Avatar
ondra.482:

a ještě bych sa optal,jak ošetřit vstupní údaje tak,že když zadám nějaké písmeno, nebo něco kromě číslich, tak aby mě to opravilo na to,abych zadal číslici....

 
Nahoru Odpovědět 13.4.2013 10:50
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Aha, tak měl jsi pravdu, doteď jsem měl pocit, že se celá operace počítá podle typu levého operandu, ale evidentně je to fuk a stačí, aby byl jen jeden operand typu float a celé se to počítá jako násobení floatů.

Každopádně nejlepší řešení je vždy oba operandy přetypovat na stejný typ, pak má člověk jistotu. :)

Nahoru Odpovědět  +1 13.4.2013 10:54
:)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.