» »

double v bitno in obratno? (c++)

double v bitno in obratno? (c++)

snow ::

Ja...počasi se bom spravil na pot k mojim polinomom, pa mi primankuje c++ znanja. Kako naj berem bite spremenljivke tipa double? In kako naj zadevo potem nazaj skupaj spravim?

Saj pri celih številih se da z bitshift in & igrat...ampak.

(Za firbče zakaj moram to znat: Kombiniral bom številke.)
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins
  • spremenilo: snow ()

Vesoljc ::

"floati" uporabljajo drugačen zapis kot "inti"

link

ne vem če bo to tko šlo...
Abnormal behavior of abnormal brain makes me normal...

OwcA ::

Tole sicer govorim na pamet, ampak nekaj v tem smislu bi naj delalo (sledeča koda ni standardna!):

double d 17.5;
void *v = &d;
__int64 *i = v;

Skratka vzameš naslov doubla in ga preko void kazalca prirediš intu z enako bitno natančnostjo.
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

snow ::

Glede IEEE...
mi lahko nekdo tole razloži:
0 10000001 10100000000000000000000 = +1 * 2**(129-127) * 1.101 = 6.5

1*4*1.625 = 6.5

10100000000000000000000 naj bi bilo 625 po kaki logiki?

Mogoče napaka tudi drugje, ampak mi pač ni jasno.

OwcA compiler javi error. Pravi da sem invalid. Oziroma, da je pretvorba invalid. Možno zelo da se da s kazalci kaj, ampak snow še tega ne zna najbolje.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

OwcA ::

@snow: sem sedaj poskusil tudi prevesti in mi tole lepo dela:

double d = 17.3;
void *pV = &d;
int i = *static_cast<int*>(pV);


Samo opzorilo, double predstavljen kot int ne bo ohranil vrednost.
Otroška radovednost - gonilo napredka.

snow ::

Hm...če dam float namesto double dela.
Double si neke fore izmišljuje.

Pa nevem zakaj mora bit v IEEE razlagi 0 čist na levi 31 čist na desni. Sama zmeda. :>

Kak pa nazaj pretvorim?
Recimo da na podoben način...


for(j=31;j<=0;j--){
bit=(1 >> j) & i;
bit = (bit) ? 1 : 0;
cout<<bit;
}

Mam za izpis, da preverjam.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Zgodovina sprememb…

  • spremenilo: snow ()

jkui ::

predlagam naslednji test:

#include <stdio.h>

void bsize(int size)
{
printf("%d\n", 8 * size);
}

int main() {
bsize(sizeof(int));
bsize(sizeof(float));
bsize(sizeof(double));

return 0;
}

pri meni (gcc, linux, via c3) je to 32, 32, 64. torej double v int ne mores kar tako skonvertat. kvecjemu v dva inta. tole pa deluje za float:

#include <iostream>
#include <cstring>

int main() {
float x = 13.4;
std::cout << x << std::endl;

int y;
memcpy(&y, &x, sizeof(int));
std::cout << y << std::endl;

float z;
memcpy(&z, &y, sizeof(int));
std::cout << z << std::endl;

return 0;
}

sicer se ga da okol prnest z raznimi kombinacijami castov, sam tole zazihr deluje :).

snow ::

Hop tole dela prav lepo.
Ko bi le še za double imel... :\

No bom pa z float naredil zadevo. Ni panike. 8-)

Hvala jkui!
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Zgodovina sprememb…

  • spremenilo: snow ()

rasta ::

Za double pa uporabi long long, ki je 64 biten (ni pa čisto po standardu).

jkui ::

Je po C99. gcc 3.2.2 mi ze recimo potegne long long. A kdo ve kater vc++ to ze podpira?

noraguta ::

cl 13.10.3077 ze podpira long long (vs 2003)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Program za C++ jezik

Oddelek: Programska oprema
232851 (1886) popaj113
»

win api (c++)

Oddelek: Programiranje
462539 (1819) Gundolf
»

Pomnilnik in c++

Oddelek: Programiranje
242143 (1852) Gundolf
»

c++ datoteke

Oddelek: Programiranje
464041 (3530) Vesoljc
»

C++ kot kaj shraniti program?

Oddelek: Programiranje
261232 (1065) rasta

Več podobnih tem