c++ double to int

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

c++ double to int

OdgovorNapisal/-a Kroko » 08 Okt 2020, 19:02

Koda: Izberi vse
double dbl = 2947365381; //0xAFAD3A05
uint32_t i = (uint32_t)std::round(dbl);
printf("%u", i);


Koliko je i? Zakaj?
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4936
Pridružen: 14 Jan 2015, 11:12
Kraj: Ljubljana
Zahvalil se je: 696 krat
Prejel zahvalo: 1723 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: c++ double to int

OdgovorNapisal/-a blasny » 08 Okt 2020, 20:18

Kratek odgovor: Odvisno. Trenutno na 32 bit MinGW: 2147483648

Daljsi odgovor: std:round lahko tudi spustimo, ker ne naredi nic. vrne isti double.
Nato se double implicitno skonvertira v long, katerega dolzina je odvisna od platforme.
V primeru, da je long 32 bitov, potem long ni dovolj dolg, da bi sprejel 2947365381, ker je to vec kot 2^31.
Rezultat je undefined. Glej "Floating–integral conversions" tukaj: https://en.cppreference.com/w/cpp/langu ... conversion
V mojem primeru -2147483648.
In za dobro mero se potem explicitno konvertira signed long v unsigned 32 bitni int, kar da 2147483648.

Ce bi to laufal na 64 bitni platformi, bi assignement double v long sicer prezivel.
Explicitna konverzija iz 64 v 32 bitov, bi pa potem naredila svoje.

Fini jezik C++. Not.
blasny
 
Prispevkov: 519
Pridružen: 18 Jan 2015, 15:48
Kraj: Tepanjce
Zahvalil se je: 344 krat
Prejel zahvalo: 154 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 18

Re: c++ double to int

OdgovorNapisal/-a Kroko » 08 Okt 2020, 21:16

Jaz v VS2018 dobim 0x80000000.

Daljsi odgovor: std:round lahko tudi spustimo, ker ne naredi nic. vrne isti double.


Koda: Izberi vse
double dbl = std::round(2947365381); //0xAFAD3A05
uint32_t i = (uint32_t)(dbl);
printf("%u", i);

Takole pa dobim pravi rezultat 0xAFAD3A05.

Pravo vprašanje je - kako cel del doubla pravilno konvertirati v uint32_t?
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4936
Pridružen: 14 Jan 2015, 11:12
Kraj: Ljubljana
Zahvalil se je: 696 krat
Prejel zahvalo: 1723 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: c++ double to int

OdgovorNapisal/-a blasny » 09 Okt 2020, 14:50

To bo verjetno se najboljse.
Seveda samo za double, ki so v intervalu od 0 do 2^32-1.
Kaksen je razlog, za to konverzijo?
blasny
 
Prispevkov: 519
Pridružen: 18 Jan 2015, 15:48
Kraj: Tepanjce
Zahvalil se je: 344 krat
Prejel zahvalo: 154 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 18


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost