Avatar
Jakub Mareček:

Ahoj
Vytvořil jsem si knihovnu v C#, vypočítává nějaké údaje, používá Math.Sin a proto jsem použil double.
Knihovna se spouští ze aplikace, která je v C++, a vrací vypočítané číslo (např. 0.66666666667). Ovšem v aplikaci se číslo zobrazuje jako 0.6666687452. Zajímalo by mě jak dosáhnout toho, aby bylo číslo vráceno v původní hodnotě (0.66666666667).
Chtěl jsem použít decimal, ale nechce se mi u každého Math.Sin převádět číslo na double.
Předem díky

 
Odpovědět 25.10.2015 17:13
Avatar
Luboš Běhounek (Satik):

Není problém až u zobrazení? Kdyžtak nahoď kód, jak si ty čísla předáváš.

Nahoru Odpovědět 25.10.2015 17:35
:)
Avatar
Jakub Mareček:

Zde je malá ukázka

double tmp_a = 16;

double t = (double)tmp_a / 24;
Console.WriteLine(t.ToString("0.###############"));

Když knihovnu zavolám z C#, vrátí se vše v pořádku (0.66666666667). Ale pokud ji zavolám z C++, vrátí se např. 0.6666687452.

 
Nahoru Odpovědět 25.10.2015 17:45
Avatar
Milan Křepelka
Redaktor
Avatar
Milan Křepelka:

Pokud přehlídnu tu podivnost, proč by měl člověk volat z C++ C# kód, tak tam může být nějaký problémek jak chápou jednotlivé jazyky čísla s plovoucí čárkou.

Zkus velikosti datových typů. Ověř kolik míst je pro desetinnou čárku pro jednotlivé jazyky či zvol jiný datový typ.

 
Nahoru Odpovědět 26.10.2015 10:33
Avatar
Odpovídá na Jakub Mareček
Libor Šimo (libcosenior):

Neviem ako to riešiš v c++, ale to vychádza z céčka a tam to funguje presne ako má.

Nahoru Odpovědět 26.10.2015 13:18
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Jakub Mareček:

No ta aplikace v C++ není moje, já k ní dělám pouze rozšíření.
Asi tam místo double dám decimal - to funguje.

 
Nahoru Odpovědět 26.10.2015 15:38
Avatar
Odpovídá na Libor Šimo (libcosenior)
Jakub Mareček:

Ano, to funguje. Ale mě nějak nefunguje přenos double z C# do C++ :-S

 
Nahoru Odpovědět 26.10.2015 18:34
Avatar
Odpovídá na Jakub Mareček
Libor Šimo (libcosenior):

Ešte máš možnosť preniesť to ako string a potom ho prekonvertovať na double.

Nahoru Odpovědět 27.10.2015 8:42
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na Jakub Mareček
David Novák:

A to máš zadáno, že rozšíření musí být v C#?
Napsání ho v C++ a přeložení na stejném překladači by zřejmě vyřešilo tvé problémy.

Nahoru Odpovědět 27.10.2015 8:58
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Jakub Mareček:

Díky za tip. Ale bohužel jsem zjistil, že již to dělení vrátí nepřesné číslo. Teď už fakt nevim kde je problém.

 
Nahoru Odpovědět 27.10.2015 15:24
Avatar
Odpovídá na David Novák
Jakub Mareček:

Ano to by vyřešilo, ovšem knihovna má několik tisíc řádků a převádět to do C++...

 
Nahoru Odpovědět 27.10.2015 15:25
Avatar
Odpovídá na Jakub Mareček
Libor Šimo (libcosenior):

...již to dělení vrátí nepřesné číslo...
to myslíš v ktorom jazyku?
Ty si napísal funkčné delenie v c# a ja v c (to isté sa dá použiť v c++).

Nahoru Odpovědět 27.10.2015 15:27
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Jakub Mareček:

Takhle:
Knihovna je v C#, a v ní je funkce:

double Vydel()
{
        double tmp_a = 16;
        double t = (double)tmp_a / 24;
        return t;
}

Pokud tu knihovnu spustím z aplikace napsané v C#, dostanu 0.66666666667.
Pokud ji spustím v aplikaci napsané v C++, dostanu (např.) 0.6666687452 a nikdy přesně to, co chci (0.66666666667).

Jo a ještě: to C++ je Win32.

 
Nahoru Odpovědět 27.10.2015 16:40
Avatar
Milan Křepelka
Redaktor
Avatar
Odpovídá na Jakub Mareček
Milan Křepelka:

Pro případ že bys neuměl dobře anglicky si to hoď to překladače.

...but again there is no simple way to get the C# compiler to reproduce the old C++ results

 
Nahoru Odpovědět 27.10.2015 17:41
Avatar
Libor Šimo (libcosenior):

Nemohlo by to byť nejak takto?

string Vydel(double x, double y)
{
    return (x / y).ToString();
}
Nahoru Odpovědět 28.10.2015 7:42
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Jakub Mareček:

Díky za rady, toto ale bohužel nefunguje, již jsem to zkoušel.

 
Nahoru Odpovědět 28.10.2015 10:01
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 17 zpráv z 17.