Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Jakub Mareček:25.10.2015 17:13

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:25.10.2015 17:35

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
https://www.facebook.com/peasantsandcastles/
Avatar
Jakub Mareček:25.10.2015 17:45

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
Tvůrce
Avatar
Milan Křepelka:26.10.2015 10:33

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):26.10.2015 13:18

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:26.10.2015 15:38

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:26.10.2015 18:34

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):27.10.2015 8:42

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
Tvůrce
Avatar
Odpovídá na Jakub Mareček
David Novák:27.10.2015 8:58

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:27.10.2015 15:24

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:27.10.2015 15:25

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):27.10.2015 15:27

...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:27.10.2015 16:40

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
Tvůrce
Avatar
Odpovídá na Jakub Mareček
Milan Křepelka:27.10.2015 17:41

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):28.10.2015 7:42

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:28.10.2015 10:01

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.